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;
};
歡迎討論、指正!