(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)