1. 程式人生 > >斐波拉契數列普通的遞迴與記憶型遞迴的耗時比較

斐波拉契數列普通的遞迴與記憶型遞迴的耗時比較

1.通過編寫普通的遞迴和記憶型的遞迴輸出執行程式碼的時間,可以發現數據量大的情況下,記憶型的遞迴是耗時是比較短的,而普通的遞迴耗時非常長

所以有的時候遇到重複子問題使用遞迴來解決的時候可以在普通的遞迴的程式碼上改進變成記憶型的遞迴那麼耗時會比較短,提高程式碼的執行效能

2. 下面是具體的程式碼:

import java.util.Scanner;
public class Main {
    static int rec[];
    static int v1 = 0;
    static int v2 = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        rec = new int[n];
        rec[0] = 1;
        rec[1] = 1;
        long start = System.currentTimeMillis();
        int res = f1(n - 1);
        System.out.println(res);
        long end1 = System.currentTimeMillis();
        System.out.println("記憶型遞迴耗時: " +(end1 - start));
        res = f2(n - 1);
        System.out.println(res);
        long end2 = System.currentTimeMillis();
        System.out.println("普通遞迴耗時: "+(end2 - end1));
        sc.close();
    }
    
    private static int f2(int n){
        if(n == 0 || n == 1) return 1;
        return f2(n - 1) + f2(n - 2);
    }

    private static int f1(int n){
        if(n == 0 || n == 1) return 1; 
        if(rec[n] > 0){
            return rec[n];
        }else{
            v1 += f1(n - 1);
            v2 = v1 + f1(n - 2);
            rec[n] = v2;
            return v2;
        }
    }
}

控制檯輸入40

輸入大於40的時候發現普通遞迴計算非常慢,耗時非常大,可見記憶型遞迴程式碼執行的優越性,這也是使用空間換時間的完美體現,消耗一定的記憶體來減小程式碼的執行時間