斐波那契數(shù)列應(yīng)用

斐波那契數(shù)列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

這個數(shù)列從第3項開始,每一項都等于前兩項之和。

如果設(shè)F(n)為該數(shù)列的第n項(n∈N*),那么這句話可以寫成如下形式::F(n)=F(n-1)+F(n-2)

顯然這是一個線性遞推數(shù)列。

數(shù)列應(yīng)用
算法:一個人爬樓梯,可以一次爬一階或者兩階,問n層樓梯有多少種爬法(來自字節(jié)跳動)

如果只有一階樓梯,那么很簡單,只有1種方法;如果有兩階樓梯呢,要么一次一階,要么一次兩階,2種方法;如果是三階呢,要么一次一階,要么先兩階后一階,要么先一階后兩階,唉,等等,是不是發(fā)現(xiàn)了什么,如果有三階的話,那么最后一步怎么走是不是有兩種,就是要么走一階,要么走兩階,如果走一階,前面還有兩階,入股走兩階,前面還有一階,那么前面的兩階或者一階怎么走呢,如果3階的方法是f(3),那么f(3)=f(2)+f(1),這么看來是不是明白多了,有人會說,如果大于3階,比如有10000階呢?即使有10000階,那最后一步也是走兩階或者一階,那么f(10000)=f(9999)+f(9998),解決就是f(n)=f(n-1)+f(n-2)。
附上代碼

    public static int StepOfNum(int n){
        if (n<=0){
            return -1;
        }
        if (n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        else{
            return StepOfNum(n-1)+StepOfNum(n-2);
        }
    }

上述遞歸的時間復(fù)雜度是 O(2^n),用迭代實現(xiàn)復(fù)雜度為O(n)。
附上代碼

int fib5(int n)          //迭代實現(xiàn)
{
    int i,a=1,b=1,c=1;
    if(n<1)
    {
        return -1;
    }
    for(i=2;i<n;i++)
    {
        c=a+b;     //輾轉(zhuǎn)相加法(類似于求最大公約數(shù)的輾轉(zhuǎn)相除法)
        a=b;
        b=c;
    }
    return c;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容