一個(gè)斐波那契(Fibonacci)數(shù)字是之前兩個(gè)斐波那契數(shù)字之和交汤。最前面的兩個(gè)數(shù)字是0和1。
用函數(shù)方式表示:
1.遞歸函數(shù)
var fabonacci = function(n){
return n < 2 ? n : fabonacci(n - 1) + fabonacci(n - 2);
}
for(var i = 0; i < 10; i++){
document.writeln('//' + i +':' + fabonacci(i));
}
缺點(diǎn):
這樣是可以實(shí)現(xiàn)的,但它做了很多無謂的工作凫佛。fabonacci函數(shù)被調(diào)用了453次。我們調(diào)用了11此孕惜,而它自身調(diào)用了442此去計(jì)算可能已被計(jì)算過的值愧薛。
2.閉包
我們?cè)谝粋€(gè)名為memo
的數(shù)組里保存我們的存儲(chǔ)結(jié)果,存儲(chǔ)結(jié)果可以隱藏在閉包中衫画。當(dāng)函數(shù)被調(diào)用時(shí)毫炉,這個(gè)函數(shù)首先檢查結(jié)果是否已經(jīng)存在,如果已經(jīng)存在削罩,就立即返回這個(gè)結(jié)果瞄勾。
var fibonacci = function(){
var memo = [0,1];
var fib = function(n){
var result = memo[n];
if(typeof result !== 'number'){
result = fib(n - 1) + fib(n - 2);
memo[n] = result;
}
return result;
}
return fib;
}();
for(var i = 0; i <= 10; i++){
var fibona = fibonacci(i);
console.log(fibona)
}
缺點(diǎn):
這個(gè)函數(shù)返回同樣的結(jié)果,但是只被調(diào)用了29次弥激。我們調(diào)用了它11次进陡,它調(diào)用了自己18次去取得之前存儲(chǔ)的結(jié)果。