關於斐波那契數的JavaScript實現

1.遞歸實現

 function folino(n){   
     if (n<2) {
         return 1;
     }else{
         return folino(n-2) + folino(n-1) ;         
     }
}

缺點:重複計算。

var another=folino;
folino=null;
another(5)      //會出錯,因爲another 函數中依然存在folino,而此時folino爲空

2.遞歸實現(使用函數表達式)

var fiboanacci=function f(num){

      if(num===0||num===1){
            return 1;
       }
      else{
           return f(num-1)+f(num-2)
      }

}
缺點:重複計算,但是像1那樣調用時不會出錯。
3.遞歸實現(帶有記憶功能)
var fiboanacci=(function(){

    var memo={};
    function f(n){
        var value;

        if (n in memo) {
            value=memo[n];
        }else{
            if (n===0 ||n===1) {            
               value=n;
            }else{
               value=f(n-1)+f(n-2);
            }
            memo[n]=value;
        }                
        return value;        
    }

    return f;
})();

優點:使用閉包實現記憶功能,避免了重複計算,提高性能。

4.思考:如下實現與3的實現有什麼不同?爲什麼不能實現預期的效果?

var  fiboanacci=function f(num){


    var memo={};
    var value;
    if (memo[num]) {
        console.log("exist");
        return memo[num];
    }
    if (num<=1) {
        value=1;
        
    }else{
        value=f(num-1)+f(num-2);        
    }
    memo[num]=value;
    console.log(memo[num]);
    return value;
};


歡迎討論、指正!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章