; hailstones
(define (hailstone n)
(let loop ((n n) (c '()))
(if (= n 1)
(reverse (cons 1 c))
(loop (if (even? n)
(quotient n 2)
(+ (* 3 n) 1))
(cons n c)))))
(display (hailstone 13)) (newline)
(display (hailstone 837799)) (newline)
(define (longest-sequence n)
(let ((cs (make-vector 1000000 0))
(max-x 1) (max-len 1))
(vector-set! cs 1 1)
(do ((k 2 (+ k 1)))
((= k n) max-x)
(vector-set! cs k
(do ((c 0 (+ c 1))
(s k (if (even? s)
(/ s 2)
(+ (* 3 s) 1))))
((< s k)
(+ (vector-ref cs s) c))))
(if (< max-len (vector-ref cs k))
(begin (set! max-x k)
(set! max-len
(vector-ref cs k)))))))
(time (display (longest-sequence 1000000)) (newline))