[算法]青蛙变态跳台阶问题

青蛙变态跳台阶问题

今天刷牛客网,碰到了这道很有趣的题目,所以写下来跟大家分享一下。

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

之前遇到过的青蛙跳台阶问题,属于斐波那契序列的问题,所以解起来也是得心应手,先附上传统青蛙跳台阶问题:

青蛙跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

n表示青蛙跳上n级台阶;
当n = 1 时,f(1) = 1;
当n = 2 时,f(2) = 2;
当n = 3 时,f(3) = 3;
当n = 4 时,f(4) = 5;
由此可见,该序列是典型的斐波那契数。
(1)第一种思路,可以采用递归法,代码如下:


function jumpFloor(n)
{
    // write code here
    //递归写法
    if(n==0 || n==1) return 1;
    else return jumpFloor(n-1)+jumpFloor(n-2);
}

(2)第二种思路,可以采用递推法,即用数组求解


function jumpFloor(number)
{
    // write code here
    var arr = [];
    arr[0] = 1; 
    arr[1] = 1;
    for(var i=2;i<=number;i++){
        arr[i] = arr[i-1]+arr[i-2];
    }
    return arr[number];
}


ok,接下来变态跳台阶showtime

用f(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳)

设定f(0) = 1;
当n = 1 时, 只有一种跳法,即1阶跳:f(1) = 1;
当n = 2 时, 有两种跳的方式,一阶跳和二阶跳:f(2) = f(1) + f(0) = 2;
当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有f(3-1)中跳法; 第一次跳出二阶后,后面还有f(3-2)中跳法;第一次跳出三阶后,后面还有f(3-3)中跳法
f(3) = f(2) + f(1)+f(0)=4;

所以:f(n) = f(n-1)+f(n-2)+f(n-3)+……….+f(n-n)
=f(0)+f(1)+f(2)+…….+f(n-1)

又因为f(n-1)=f(0)+f(1)+f(2)+…….+f(n-2)
两式相减得:f(n)-f(n-1)=f(n-1)
f(n) = 2*f(n-1) (n >= 2 )

所以,有以下解法

function jumpFloorII(number)
{
    // write code here
    //递归
    if(number == 1) return 1;
    else return 2*jumpFloorII(number-1);
}

我又发现,2*jumpFloorII(number-1)其实就是2的幂,因此,我写了如下的代码:

function jumpFloorII(number)
{
    // write code here
    if(number == 1) return 1;
    else return 2**(number-1);
}

测试也是能够通过的。

以上变态跳台阶问题的思路和表述参考自以下博客:https://blog.csdn.net/qq_28787211/article/details/78990865

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值