The 3n + 1 problem is fairly well known (one example). Given a positive integer n, as long as n is greater than 1 repeatedly replace n by 3n + 1 if n is odd or by n/2 otherwise. The sequence of integers created is called the cycle for n.
Given two positive integers i and j, the max-cycle for i and j is the largest cycle for all integers between i and j inclusive at both ends. Write a program that reads pairs of integers and finds the max-cycle for each pair read.
(use-modules (ice-9 format)) (define (main port) (define (int-reader f) (let ((i (read port))) (if (integer? i) (f i)))) (let loop () (int-reader (lambda (i) (int-reader (lambda (j) (format #t "~d ~d ~d" i j (max-cycle i j)) (newline) (loop))))))) (define (max-cycle i j) (define (max-cycle' i j max-cyc) (if (> i j) max-cyc (max-cycle' (+ i 1) j (max max-cyc (cycle i))))) (max-cycle' (min i j) (max i j) 0)) (define (cycle i) (define (cycle' i len) (if (= i 1) len (cycle' (if (odd i) (+ (* 3 i) 1) (/ i 2)) (+ len 1)))) (if (> i 0) (cycle' i 1) 0)) (define (odd n) (= 1 (remainder n 2))) guile> (define inp (open-file "t" "r")) guile> (main inp) 1 10 20 100 200 125 201 210 89 900 1000 174 guile>