18 lines
622 B
Clojure
18 lines
622 B
Clojure
(defn hailstone-seq [n]
|
|
{:pre [(pos? n)]}
|
|
(lazy-seq
|
|
(cond (= n 1) '(1)
|
|
(even? n) (cons n (hailstone-seq (/ n 2)))
|
|
:else (cons n (hailstone-seq (+ (* n 3) 1))))))
|
|
|
|
(let [hseq (hailstone-seq 27)]
|
|
(-> hseq count (= 112) assert)
|
|
(->> hseq (take 4) (= [27 82 41 124]) assert)
|
|
(->> hseq (drop 108) (= [8 4 2 1]) assert))
|
|
|
|
(let [{max-i :num, max-len :len}
|
|
(reduce #(max-key :len %1 %2)
|
|
(for [i (range 1 100000)]
|
|
{:num i, :len (count (hailstone-seq i))}))]
|
|
(println "Maximum length" max-len "was found for hailstone(" max-i ")."))
|