您應該正確縮進您的代碼。正確的格式化,它是
(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猜想是真實的)。解決這個問題,你最終會得到:...「 –