blob: 9f5865613519cb86535b311d1c87f8e963244852 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
;;;
;;; Problem 14: Longest Collatz Sequence
;;;
;;; https://projecteuler.net/problem=14
(use-modules (srfi srfi-1))
(define (collatz n)
(if (even? n)
(/ n 2)
(+ (* 3 n) 1)))
(define (collatz-fold n init proc)
(let loop ((n n)
(result init))
(if (= n 1)
result
(let ((c (collatz n)))
(loop c (proc c result))))))
(define (collatz-length n)
"Return the length of the Collatz sequence for N"
(collatz-fold n 1 (lambda (n length) (1+ length))))
;; Just for fun.
(define (collatz-sequence n)
"Return the Collatz sequence for N."
(reverse (collatz-fold n (list n) cons)))
(define (longest-collatz up-to)
(let loop ((n 13)
(m 13)
(length 10))
(if (>= n up-to)
m
(let ((l (collatz-length n)))
(if (> l length)
(loop (1+ n) n l)
(loop (1+ n) m length))))))
(longest-collatz (expt 10 6))
|