方案中的 Collat​​z 函数

use*_*945 2 scheme collatz

所以我试图在方案中迭代地解决 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)) 
            )
            )
    )
)
Run Code Online (Sandbox Code Playgroud)

但是,我的测试用例始终导致“#[constant 13 #x2]”。我写错了什么,如果有的话?

Ósc*_*pez 6

你忘了打电话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
Run Code Online (Sandbox Code Playgroud)

这就是维基百科中示例的工作原理:

(collatz 6)
=> 9

(collatz 11)
=> 15

(collatz 27)
=> 112
Run Code Online (Sandbox Code Playgroud)

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