После написания функции генерации последовательности Коллатца обычным способом:
(define (colatz-seq #;starting@ n)
(cond ((= n 1) '())
((even? n) (cons (/ n 2) (colatz-seq (/ n 2))))
((odd? n) (cons (+ (* n 3) 1) (colatz-seq (+ (* n 3) 1))))))
Я хотел написать это, используя unfold:
(define (next-colatz-step n)
(cond ((even? n) (/ n 2))
((odd? n) (+ (* n 3) 1))))
(define (one? n)
(= n 1))
(define (colatz-seq #;starting@ n)
(unfold one? next-colatz-step next-colatz-step n))
И он работает, как и ожидалось, однако я не мог заставить его работать без использования «next-colatz-step» в качестве второго и третьего параметра развертывания. Почему? Кажется странным предоставлять один и тот же аргумент двум параметрам.