(use srfi-1) (define (collatz n) (let ((stop (lambda (s) (= s 1))) (term (lambda (s) (cond ((even? s)(/ s 2)) ((odd? s)(+ (* s 3) 1)) (else s))))) (unfold stop (lambda (s) (let ((v (term s))) (if (stop v) s (cons s (collatz v))))) term n (lambda (s) (cons s '()))))) (collatz 3) ; -> ((3 (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) ;; ((3 ;; (10 ;; (5 ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (5 ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (10 ;; (5 ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (5 ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (16 ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1) ;; (8 ;; (4 2 1) 2 1) ;; (4 2 1) 2 1)