【刷算法】我曉得的一切相似斐波那契數列的題目

有一類算法問題相似斐波那契數列,而且解決辦法基礎差不多。
不相識斐波那契套路的能夠看【刷算法】斐波那契數列

跳台階問題

問題形貌
一隻田雞一次能夠跳上1級台階,也能夠跳上2級。求該田雞跳上一個n級的台階總共有若干種跳法。
剖析
設到第n階總共有f(n)種跳法,而且想跳到第n階只要兩種能夠,要麼從第n-1階跳一階抵達,要麼從第n-2階跳兩階抵達,所以遞推式為f(n)=f(n-1)+f(n-2)。特別狀況為,n=0的時刻跳法為0;n=1時,跳法為1;n=2時,跳法為2
遞歸

function jump(n) {
    if(n < 1)
        return 0;
    if(n === 1)
        return 1;
    if(n === 2)
        return 2;
    return jump(n-1) + jump(n-2);
}

非遞歸

function jumpFloor(number)
{
    if(number < 1)   
        return 0;
    if(number === 1)
        return 1;
    if(number === 2)
        return 2;
    var s1 = 1;
    var s2 = 2;
    var res =  0;
    for(var i = 3;i <= number;i++){
        res = s1 + s2;
        s1 = s2;
        s2 = res;
    }
    return res;
}

變態跳台階問題

問題形貌
一隻田雞一次能夠跳上1級台階,也能夠跳上2級……它也能夠跳上n級。求該田雞跳上一個n級的台階總共有若干種跳法。
剖析
變態的跳台階問題處置懲罰起來確實是有些辣手,一次能夠跳上的階數是不定的。
先看n=0時,跳法f(0)=0;
n=1,只能是從第0個台階跳過來,跳法f(1)=1;
n=2,多是第0個台階跳了2階或許從第1個台階跳了1階,跳法f(2)=f(0)+f(1);
n=3,多是第0個台階跳了3階、第1個台階跳了2階、第2個台階跳了1階,跳法f(3)=f(0)+f(1)+f(2);

n=n-1,跳法f(n-1)=f(0)+f(1)+f(2)+…+f(n-2);
n=n,跳法f(n)=f(0)+f(1)+f(2)+…+f(n-1);
由上面兩個等式得:f(n) = f(n-1)+f(n-1) = 2f(n-1)
代碼完成:

function jumpFloorII(number)
{
    if(number < 1)
        return 0;
    if(number === 1)
        return  1;
    return 2*jumpFloorII(number-1)
}

矩陣掩蓋

問題形貌
我們能夠用21的小矩形橫着或許豎著去掩蓋更大的矩形。叨教用n個21的小矩形無堆疊地掩蓋一個2*n的大矩形,總共有若干種方法?
剖析
ps:為了輕易剖析問題,給每一個小矩形差異的色彩,實在他們之間沒有差異
《【刷算法】我曉得的一切相似斐波那契數列的題目》
假定上圖為用n個21的小矩形無堆疊地掩蓋一個2n的大矩形,方法數為f(n),那末f(n)能夠從哪些狀況推導出來呢?
起首很明顯我們曉得,2*1的小矩形要麼是橫着放要麼是豎著放,所以f(n)的狀況只能由以下兩種狀況得來:
《【刷算法】我曉得的一切相似斐波那契數列的題目》
這類狀況只需要再加一個豎著的小矩形就能夠了,所以這類狀況實際上是f(n-1)
《【刷算法】我曉得的一切相似斐波那契數列的題目》
這類狀況下,只需要再加一個橫着的小矩形就能夠了,然則由於這類橫着的小矩形只能成對湧現,所以這類狀況實際上是f(n-2)
綜上,f(n) = f(n-1)+f(n-2)
特別狀況時,f(0)=0,f(1)=1,f(2)=2
代碼完成
遞歸版

function rectCover(n)
{
    if(n === 0)
        return 0;
    if(n === 1)
        return 1;
    if(n === 2)
        return 2;
    return rectCover(n-1) + rectCover(n-2)
}

非遞歸版

function rectCover(n)
{
    if(n === 0)
        return 0;
    if(n === 1)
        return 1;
    if(n === 2)
        return 2;
    var s1 = 1, s2 = 2;
    var res = 0;
    for(var i = 3;i <= n;i++) {
        res = s1 + s2;
        s1 = s2;
        s2 = res;
    }
    
    return res;
}

母牛生小牛問題

問題形貌
假定農場中成熟的母牛每一年只會生一頭小母牛,且永久不會死。第一年農場有1頭成熟的母牛,從第二年最先,母牛最先生小母牛,每隻小母牛3年以後成熟又能夠生小母牛。給定整數N,求N年後牛的數目。
剖析
設f(n)為n年後牛的數目,則第n年牛的泉源有兩個。
起首,牛是永久不會死的,所以第n-1的牛都邑活到第n年;
其次,另有一部分重生的牛,由於每隻小母牛3年以後成熟才能夠生小母牛,所以第n-3年的未成熟小母牛到了第n年會成熟且最先生小母牛,所以第n年重生的牛來自於第n-3年的未成熟小母牛和成熟母牛。
綜上,f(n) = f(n-1) + f(n-3)
特別的,f(1)=1,f(2)=2,f(3)=3
代碼完成
直接非遞歸版

function cow(n) {
    if(n < 1)
        return 0;
    if(n === 1)
        return 1;
    if(n === 2) 
        return 2;
    if(n === 3)
        return 3;
    var s1 = 1, s2 = 2, s3 = 3;
    var res = 0;
    for(var i = 4;i <= n;i++){
        res = s1+s3;
        s1 = s2;
        s2 = s3;
        s3 = res;
    }
    
    return res;
}
    原文作者:亞古
    原文地址: https://segmentfault.com/a/1190000015338575
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞