剑指offer:递归和循环系列问题解答
目录
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
使用递归的方式如果数字较大会有很严重的效率问题!可以用二叉树的方式表示这种依赖关系:(以9为例子)
不难发现,出现了很多重复节点,大大降低了运算效率!
class Solution {
public:
int Fibonacci(int n) {
if(n < 2)
return n;
int a = 0;
int b = 0;
int c = 1;
for(int i = 1;i < n;i++)
{
a = b + c;
b = c;
c = a;
}
return a;
}
};
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
class Solution {
public:
int jumpFloor(int number) {
if( number < 2 )
{
return 1;
}
return jumpFloor(number - 1) + jumpFloor(number - 2);
}
};
如果把n级台阶看出是n的函数f(n),台阶数n>=2,第一次跳台阶就有两种不同的选择,1:第一次跳一阶剩下的台阶数为f(n - 1),2:第一次跳两阶时剩下的台阶数为f(n - 2)。
因此总共的可能性为f(n) = f(n - 1) + f(n - 2);不难看出这是一个斐波那契数列!
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析如下:
f(1) = 1
f(2) = f(2-1) + f(2-2)
f(3) = f(3-1) + f(3-2) + f(3-3)
...
f(n-1) = f(n-2) + f(n-3) + ... + f(n-1-(n-1))
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)
所以可以推出:f(n) = f(n-1) + f(n-1) =f(n-1) * 2
class Solution {
public:
int jumpFloorII(int number) {
if(number < 2)
return number;
return jumpFloorII(number - 1) * 2;
}
};
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
class Solution {
public:
int rectCover(int number) {
if(number <= 2)
return number;
return rectCover(number -1) + rectCover(number -2);
}
};
设n个矩形为f(n),如果第一个竖着放时剩下的为f(7),如果第一个横着放是为f(6),剩下的可能性为f(n) = f(n -1) + f(n -2)