学习斐波那契数列,了解算法思想

1,123 阅读2分钟

斐波那契介绍:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
在一般的算法题中,斐波那契最直接的体现就是爬楼梯算法和翻书算法:
题1:假设总共有100节楼梯,每次只能上一节或者两节,请问有多少种上法?
题2:假设总共有100页书,每次只能翻一页或者两页,有多少种翻法?
两道很经典的题,计算方式其实一样你,那我们就用斐波那契来解一下

//爬100节,那么到最后一定是从99节或者98节爬上去的,所以爬100节的方法就是爬99节+爬98节的方法
f(100)=f(99)+f(98) 
那么 f(99)=f(98)+f(97)  f(98)=f(97)+f(96)...以此类推直到加到f(1)
so
function fib(n){
    if(n===1)return 1
    if(n===2) return 2
    if(n>2){
        return f(n-1)+f(n-2)
    }
}
看似很简单的就你能够利用递归求出,其实这种方法做了好多次重复计算
f(100)=f(99)+f(98)
f(99)=f(98)+f(97)
f(98)=f(97)+f(96)
所以 f(100)=f(99)+f(98)+f(98)+f(97)+f(97)+f(96)..
从98往下算,每一次已经计算出来,可是还要在重新计算一次,大大的浪费了性能。那么,我们就要想出一个更好的方法来进行一次优化。既然已经计算出的结果,那么我们可以可以就把它存储起来,用到的时候就直接拿呢?当然可以

function fib(n){
    let arr=new Array(n).fill(0)
    arr[1]=1
    arr[2]=2
    if(n>2){
        for(let i=3;i<=n;i++){
        //这里开始我们就从缓存中拿数据了
        // arr[3]=arr[2]+arr[1]  arr[4]=arr[3]+arr[2] 每次需要数据,其实就已经在前边计算出来了
            arr[i]=arr[i-1]+arr[i-2]
        }
    }
    return arr[n]
}

这样就大大降低了计算所需要的时间。