2013-10-10 46 views
0

,所以我试图迭代求解的在Collat​​z功能的计划,但我的测试用例一直显示为在Collat​​z功能

(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 ]”。如果有的话,我写错了什么?

回答

4

你忘了打电话collatz-iter。另外,目前还不清楚你打算如何处理counter,你只是增加它,但从来没有真正使用它的值 - 你的程序总是返回1(假设Collat​​z猜想是真的,这似乎很有可能)。

我猜你打算返回柜台,所以这里的如何解决你的程序:

(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 

所以基本上我们要计算给定数量的Collat​​z序列的长度。

2

当我尝试在球拍运行代码我得到的错误:

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 
> 
2

您应该正确缩进您的代码。正确的格式化,它是

(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,当它最终到达基本案例(当然假设Collat​​z猜想是真实的)。解决这个问题,你会得到:

(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)))))) 
+0

哦!我的意思是把电话打回来,但我必须留下空白。我现在也很困惑,为什么我的测试用例都读为1,因为我试图计算答案的步骤而不是答案本身 – user2789945

+0

@ user2789945请参阅我的答案末尾的代码以及评论“一旦你做完了这些,你会发现它总是返回1,当它最终到达基本案例(当然,假设Collat​​z猜想是真实的)。解决这个问题,你最终会得到:...“ –