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