iriya_ufo’s blog

Curiosity was simply the first derivative of knowledge.

末尾再帰

プログラミング言語 SCHEME」より

以下4つのプロシージャーにおいて,どれが末尾再帰でどれがそうでないかを説明せよ.

  • factorial1
(define factorial1
  (lambda (n)
    (let fact ((i n))
      (if (= i 0)
	  1
	  (* i (fact (- i 1)))))))
  • factorial2
(define factorial2
  (lambda (n)
    (let fact ((i n) (a 1))
      (if (= i 0)
	  a
	  (fact (- i 1) (* a i))))))
  • fibonacci1
(define fibonacci1
  (lambda (n)
    (let fib ((i n))
      (cond
       ((= i 0) 0)
       ((= i 1) 1)
       (else (+ (fib (- i 1)) (fib (- i 2))))))))
  • fibonacci2
(define fibonacci2
  (lambda (n)
    (if (= n 0)
	0
	(let fib ((i n) (a1 1) (a2 0))
	  (if (= i 1)
	      a1
	      (fib (- i 1) (+ a1 a2) a1))))))

我的答

非末尾再帰プロシージャー

  • factorial1
  • fibonacci1

末尾再帰プロシージャー

  • factorial2
  • fibonacci2

だと思うんですがどうでしょう?

視覚的に確かめるために,slib の trace で見てみましたが,違いが表れてない?
なんでだろ.