青蛙变态跳台阶问题
今天刷牛客网,碰到了这道很有趣的题目,所以写下来跟大家分享一下。
题目:一只青蛙一次可以跳上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