斐波那契相关问题

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。


当n=1,有1种
当n=2,有2种。
当n=3,三种(3个1,先1后2,先2后1)
当n=3时可以这样看:
如果第一步跳1,剩余两个台阶,两个台阶就是当n=2的总数
否则第一步跳2,剩余一个台阶,一个台阶就是当n=1的总数
S(3)=S(2)+S(1),S(n)=S(n-1)+S(n-2);斐波那契数列。

function jumpFloor($number)
{
    // write code here
    $arr = array(1,2);

    if($number==1||$$number==2){
        return $arr[$number-1];
    }
    for ($i =2;$i<=$number;$i++){
        $arr[$i] = $arr[$i-1]+$arr[$i-2];
    }
    return $arr[$number-1];
    
}

题目扩展

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。


上述的公式换成S(n)=S(n-1)+S(n-2)+...S(1)+1;(n>3)

function jumpFloorII($number)
{
    // write code here
    $arr = array(1,2);

    if($number==1||$$number==2){
        return $arr[$number-1];
    }
    for ($i =2;$i<=$number;$i++){
        for ($j = $i-1;$j>=0; $j--){
           $arr[$i] += $arr[$j]; 
        }
        $arr[$i] += 1;
    }
    return $arr[$number-1];
}

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?


和上面的问题类似,根据第一块木板横着还是竖着,可以建立类似于斐波那契数列的递推关系。

function rectCover($number)
{
    if ($number == 0){
        return 0;
    }
    // write code here
    $arr = array(1,2);
    if($number==1||$$number==2){
        return $arr[$number-1];
    }
    for ($i =2;$i<=$number;$i++){
        $arr[$i] = $arr[$i-1]+$arr[$i-2];
    }
    return $arr[$number-1];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容