PHP算法之斐波那契數列(遞歸)

/*斐波那契數列 源代碼分析
f(x) =  1 ;            當 x < 2 ;
f(x) = f(x-1)+f(x-2);  當 x >= 2 ;
通項式爲:fn ={((1+根號5)/2)^n-((1-根號5)/2)^n}/(根號5)
則根據通項式構造函數求fn;
*/
//計時函數  console.time() //計時開始  console.timeEnd() //計時結束並輸出時長
console.time();
var i;
var total;
//方法一  使用原始方法
function fibo(i)
{
    if(i == 0){
        return 1;
    }else if(i == 1){
        return 1;
    }else{
        total = fibo(i-1) + fibo(i-2);
        return total;
    }
}
//方法二 使用迭代解法, 將每一次執行的數據保存起來,時間會大大縮短
function  fibo1(i)
{
    if(i<=1){
        return 1;
    }
    var pre = 1;
    var prepre = 1;
    for(j = 2; j <= i; j++){
        total = pre + prepre;
        prepre = pre;
        pre = total;
    }
    return total;
}
console.log(fibo(40));//結果爲:165580141  時間爲:2313.9990234375ms;
console.log(fibo1(40));//結果爲:165580141  時間爲:0.805908203125ms;
console.timeEnd();

對比結果可能fibo1函數明顯比fibo函數優化的明顯,時間複雜度爲O(x);html

fibo1的思路爲:將每一次遞歸的數值保存起來,後期就不須要再次的尋找;函數

關於斐波那契數列優化的方法還有不少,這裏先將這一種,還有一些涉及到比較難懂的高等數學,對於初學者會比較的難學;優化

注意:上述代碼爲js代碼,請嵌入到html文件中運行;spa

計時函數 console.time() //計時開始code

console.timeEnd() //計時結束並輸出時長htm

單位以ms來計算;blog

 

相關文章
相關標籤/搜索