第一个不是尾递归的,第二个是。比较一下速度。
(define fibonacci
(lambda (n)
(let fib ((i n))
(cond
((= i 0) 0)
((= i 1) 1)
(else (+ (fib (- i 1)) (fib (- i 2))))))))
(fibonacci 30)
(define fibonacci1
(lambda (n)
(if (= n 0)
0
(let fib ((i n) (a1 1) (a2 0))
(if (= i 1)
a1
(fib (- i 1) (+ a1 a2) a1))))))
(fibonacci1 30)
发现第一个在 (fibonacci 35) 的时候已经慢得无法忍受。因为这里 的递归调用成指数增长。
而第二个版本却很快。因为它是尾递归,调用次数是线性增长。