0
(define log2_tail
   (lambda (n)
     (letrec ((log2 (lambda (n res)
                       (if (= n 1)
                           res
                           (log2 (quotient (+ n 1) 2) (+ 1 res))))))
        (log2 n 0))))
(log2_tail 3)

上面的代码是方案尾递归代码,用于计算对数基数 2 的整数部分。(实际上我不确定)但是如果我使用参数 3 执行,结果是 2 而不是 1。我猜是因为我使用了 letrec,然后我该如何解决?

4

1 回答 1

1

请注意,更清晰的写法是使用 'named let';这可能使人们更容易专注于功能。像这样。

(define (log2_tail n)
  (let log2 ((n n) (res 0))
    (if (= n 1)
        res
        (log2 (quotient n 2)
              (+ 1 res)))))

一个'named let'被编译器翻译成a letrec

于 2013-04-07T21:33:56.613 回答