在Collatz功能
,所以我试图迭代求解的在Collatz功能的计划,但我的测试用例一直显示为在Collatz功能
(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))
)
)
)
)
但是,我的测试案例不断产生“#[常量13#X2 ]”。如果有的话,我写错了什么?
你忘了打电话collatz-iter
。另外,目前还不清楚你打算如何处理counter
,你只是增加它,但从来没有真正使用它的值 - 你的程序总是返回1
(假设Collatz猜想是真的,这似乎很有可能)。
我猜你打算返回柜台,所以这里的如何解决你的程序:
(define (collatz n)
(define (collatz-iter n counter)
(if (<= n 1)
counter ; return the counter
(if (even? n)
(collatz-iter (/ n 2) (+ counter 1))
(collatz-iter (+ (* n 3) 1) (+ counter 1)))))
(collatz-iter n 1)) ; call collatz-iter
,这是它如何工作的例子wikipedia:
(collatz 6)
=> 9
(collatz 11)
=> 15
(collatz 27)
=> 112
所以基本上我们要计算给定数量的Collatz序列的长度。
当我尝试在球拍运行代码我得到的错误:
no expression after a sequence of internal definitions
这是在告诉我们,collatz
功能conatains的collatz-iter
定义,但没有表情来调用它(比递归调用其他在collatz-iter
)。这可以通过将(collatz-iter n 0)
的呼叫添加为collatz
中的最后一行来解决。
但是,当您运行该程序时,它总是返回1.不是很有趣。相反,如果你改变它返回的counter
值,你可以看到它的许多步骤需要花费的序列达到1
(define (collatz n)
(define (collatz-iter n counter)
(if (<= n 1)
counter
(if (even? n) (collatz-iter (/ n 2) (+ counter 1))
(collatz-iter (+ (* n 3) 1) (+ counter 1))
)
)
)
(collatz-iter n 0)
)
我们可以检查它,在维基百科的文章Collatz conjecture给出几个例子。
> (collatz 6)
8
> (collatz 11)
14
> (collatz 27)
111
>
您应该正确缩进您的代码。正确的格式化,它是
(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猜想是真实的)。解决这个问题,你最终会得到:...“ –