方案:我的尾递归代码有什么错误?

时间:2013-04-07 20:50:23

标签: scheme

(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,那我怎么解决呢?

1 个答案:

答案 0 :(得分: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'翻译成letrec