1. 跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
如果第一次跳一个台阶,那么剩下n-1个台阶,再进行f(n-1)次
如果跳两个台阶,那么剩下n-2个台阶,再进行f(n-2)次
这就类似于 Fibonacci,可以用递归和循环来解决这个问题。
方法一:递归
class Solution {
public:
int jumpFloor(int number) {
int count=0;
if(number<=0)
return 0;
else if(number==1)
count=1;
else if(number==2)
count=2;
else
count=jumpFloor(number-1)+jumpFloor(number-2);
return count;
}
};
方法二:循环
class Solution {
public:
int jumpFloor(int number) {
if(number<=0)
return 0;
int n1=0,n2=1,n=0;
for(int i=1;i<=number;i++)
{
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}
};
循环要比递归更快,所以是推荐用循环,也就是下面那个方法。
2.变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这个题目可以先列出几种情况
只有一个台阶的时候,只有一种方法。f(1)=1
有两个台阶的时候,有两种方法。f(2)=2 =f(1)+f(0) (假设f(0)=1)
有三个台阶的时候,有4种方法,(先跳一个台阶,先跳两个台阶,和先跳三个台阶)。 f(3)=4 =f(2)+f(1)+f(0)
有n个台阶的时候,那么f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(0)
而同时,f(n-1)=f(n-2)+f(n-3)+...+f(0)
因此f(n)也可以化简为f(n)=2*f(n-1)
由此又可以有递归和循环两种方法,依然推荐用循环的方法:
class Solution {
public:
int jumpFloorII(int number) {
int n0=1,n1=1;
for(int i=2;i<=number;i++)
{
n1=2*n0;
n0=n1;
}
return n1;
}
};