一、递归实现
斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、......这个数列的规律就是从第三项开始的每一项都等于前面两项的和,例2=1+1 ,8=3+5,用函数表示就是F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2),下面我们用递归实现一下
function fib(n){
if(n<3) return 1
return fib(n-1) + fib(n-2)
}
console.log(fib(5))
输出5
用递归的方法实现此数列确实挺简洁,方便理解。但是我们仔细观察上面的代码,就会发现此函数中存在着大量的冗余计算,并且n越大,冗余的越多。例如下图:
图中每个分支上的函数都是单独调用的,并且都是重复的调用,针对这种冗余计算,我们可以做相关的优化,优化的思路都是减少相同函数的重复调用。
二、优化
方法一、使用非递归实现
function fb(n) {
let last1=1,last2=1,temp
for(let i=3;i<=n;i++){
temp = last1+last2
last1=last2
last2=temp
}
return last2
}
两个指针在同步的向后移动
方法二、使用空间换效率
function fib(n){
let arr = [0,1,1]
for(let i=3;i<=n;i++){
arr[i]=arr[i-1]+arr[i-2]
}
return arr[n]
}
把计算出的值放到数组里
方法三、使用缓存
function fib(n){
let cache=[0,1,1]
function _fib(n){
if(cache[n]) return cache[n]
cache[n] = _fib(n-1) + _fib(n-2)
return cache[n]
}
return _fib(n)
}
把分支里涉及到的冗余计算放到数组中,用到的时候,直接拿出来用就行,而不用再计算一次。
以上就是递归的优化方法。
本文内容参考自饥人谷前端课程