1. 程式人生 > >SICP 1.2.2 樹形遞歸 (斐波那契數)

SICP 1.2.2 樹形遞歸 (斐波那契數)

mce oid nbsp dig efi del 叠代 reat public

(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))

樹形遞歸:計算步驟 隨輸入 指數性 增長,空間 隨輸入 線性 增長.

(define (fib n)
(fib-iter 1 0 n))

(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))

線性叠代:計算步驟 隨輸入 線性 增長,空間 隨輸入 線性 增長.

用java寫出來看看到底有多厲害:


/**
* Created by Ramble on 2017/11/22.
*/
public class Fib {
public static long digui(long n) {
if (n==0)
return 0;
if (n==1)
return 1;
else {
return digui(n-1)+digui(n-2);
}
}

public static long diedai(long n) {
return diedai_iter(1, 0, n);
}

public static long diedai_iter(long a, long b, long count) {
if (count==0)
return b;
else {
return diedai_iter(a+b, a, count-1);
}
}

public static void main(String[] args) {
long startTime = System.currentTimeMillis();
System.out.println(digui(50L));
// System.out.println(diedai(50L));
long endTime = System.currentTimeMillis();
System.out.println("程序運行時間:"+(endTime-startTime)+"ms");

}
}

在n為50的時候:

樹形遞歸程序運行時間:70805ms

而線性叠代絕大部分時候都是0ms.

(Java裏面函數名不允許 - 這個符號)

SICP 1.2.2 樹形遞歸 (斐波那契數)