您应该正确缩进您的代码。使用适当的格式,它是
(define (collatz n)
(define (collatz-iter n counter)
(if (<= n 1)
1
(if (even? n)
(collatz-iter (/ n 2) (+ counter 1))
(collatz-iter (+ (* n 3) 1) (+ counter 1))))))
这显然没有要执行的正文形式,只是一个内部定义。您需要添加对 的调用collatz-iter
,如下所示:
(define (collatz n)
(define (collatz-iter n counter)
(if (<= n 1)
1
(if (even? n)
(collatz-iter (/ n 2) (+ counter 1))
(collatz-iter (+ (* n 3) 1) (+ counter 1)))))
(collatz-iter n 1))
(我不确定你的初始counter
值应该是多少。我假设1
它是合理的,但也许它应该为零?)更好的是,由于它只是调用的主体collatz-iter
,你可以使它成为一个命名的 let,即更像你的原始代码:
(define (collatz n)
(let iter ((n n) (counter 1))
(if (<= n 1)
1
(if (even? n)
(iter (/ n 2) (+ counter 1))
(iter (+ (* n 3) 1) (+ counter 1))))))
这有点像将内部定义与对本地函数的单个调用相结合。但是,一旦你完成了这个,你会看到它总是返回1
,当它最终到达基本情况时(当然,假设 Collatz 猜想是真的)。解决这个问题,你最终会得到:
(define (collatz n)
(let iter ((n n) (counter 1))
(if (<= n 1)
counter
(if (even? n)
(iter (/ n 2) (+ counter 1))
(iter (+ (* n 3) 1) (+ counter 1))))))