末尾再帰
以下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 で見てみましたが,違いが表れてない?
なんでだろ.