执行一次迭代的函数:
(define (collatz x)
(if (even? x)
(/ x 2)
(+ (* x 3) 1)))
这个函数接受一个输入并循环,直到它达到 1。该函数返回到达该状态所需的迭代次数(尝试绘制这个 - 它看起来很酷):
(define (collatz-loop x)
(if (= x 1) 1
(+ (collatz-loop (collatz x)) 1)))
根据要求,这是 collatz-loop 的尾递归版本:
(define (collatz-loop x)
(define (internal x counter)
(if (= x 1) counter
(internal (collatz x) (+ counter 1))))
(internal x 1))
此函数接受一个范围并返回需要最多步数才能到达终点的数字以及步数:
(define (collatz-range a b)
(if (= a b)
(cons a (collatz-loop a))
(let ((this (collatz-loop a))
(rest (collatz-range (+ a 1) b)))
(if (< this (cdr rest)) rest
(cons a this)))))
(collatz-range 1 20) ; returns (18 . 21), which means that (collatz-loop 18) returns 21
这是 collatz 范围,尾递归:
(define (collatz-range a b)
(define (internal a best)
(if (< b a) best
(internal (+ a 1)
(let ((x (collatz-loop a)))
(if (< x (cdr best))
best
(cons a x))))))
(internal a (cons -1 -1)))