第一个不是尾递归的,第二个是。比较一下速度。
(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) 的时候已经慢得无法忍受。因为这里 的递归调用成指数增长。
而第二个版本却很快。因为它是尾递归,调用次数是线性增长。