Scheme 方案:什么&x27;我的尾部递归代码中的错误?

Scheme 方案:什么&x27;我的尾部递归代码中的错误?,scheme,Scheme,上面的代码是scheme-tail递归代码,用于计算logbase 2的整数部分(实际上我不确定),但如果使用参数3执行,结果是2而不是1。我想这是因为我使用了letrec,那么我如何解决它呢?注意,写这篇文章的更清晰的方法是使用“命名let”;这可能使人们更容易关注功能。像这样 (define log2_tail (lambda (n) (letrec ((log2 (lambda (n res) (if (= n 1)

上面的代码是scheme-tail递归代码,用于计算logbase 2的整数部分(实际上我不确定),但如果使用参数3执行,结果是2而不是1。我想这是因为我使用了letrec,那么我如何解决它呢?

注意,写这篇文章的更清晰的方法是使用“命名let”;这可能使人们更容易关注功能。像这样

(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)

编译器将“命名let”翻译成
letrec

计算商时不要加1。@Terje D.哎呀,我不想修改那部分,谢谢。然后我想知道它是尾部递归。我对你的帖子加了1分,因为它是正确的,但有一个小毛病:它的名字叫
let
,而不是
的名字叫let
。(例如,看看R5RS文档,您会看到它的排版方式与R5RS相同。)谢谢,我不习惯使用其他表单。然后是右尾递归?它是尾部递归,因为对
log2
的递归调用位于
if
的尾部位置,而
if
位于
let
的尾部位置。
(define (log2_tail n)
  (let log2 ((n n) (res 0))
    (if (= n 1)
        res
        (log2 (quotient n 2)
              (+ 1 res)))))