您应该正确缩进您的代码。正确的格式化,它是
(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
一个电话,就可以让这个名为让利,这更像是你的原代码:
(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))))))
哦!我的意思是把电话打回来,但我必须留下空白。我现在也很困惑,为什么我的测试用例都读为1,因为我试图计算答案的步骤而不是答案本身 – user2789945
@ user2789945请参阅我的答案末尾的代码以及评论“一旦你做完了这些,你会发现它总是返回1,当它最终到达基本案例(当然,假设Collatz猜想是真实的)。解决这个问题,你最终会得到:...“ –