summaryrefslogtreecommitdiff
path: root/problem-14.scm
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))