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 で実行すると、結果は 1 ではなく 2 になります。どうすれば解決できますか?

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

letrec「名前付き let」は、コンパイラによって に変換されます。

于 2013-04-07T21:33:56.613 に答える