2013-10-10 83 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猜想是真實的)。解決這個問題,你最終會得到:...「 –