斐波那契:
递归实现:
long long Fibonacci(unsigned int n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
循环实现:
long long Fibonacci(unsigned int n)
{
int result[2] = { 0.1 };
if (n < 2)
return result[n];
long long FibN_one = 0;
long long FibN_two = 1;
long long Fib;
for(unsigned int i = 2; i <= n; ++i)
{
Fib = FibN_one + FibN_two;
FibN_one = FibN_two;
FibN_two = Fib;
}
return Fib;
}
递归实现的分析(分析下图得出如下结论):
1. 递归的时间复杂度是以 n的指数方式增长的,即O(2^n)
2. 递归会使得重复的节点随着n的增大而急剧增加
3. 有的问题,可以使用递归的方法从上向下分析问题,而尽可能用循环的方式从下向上来实现代码
青蛙跳台阶:
一只青蛙一次可以跳 1级台阶,也可以跳2 级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。
分析:
跳到n级上可以由 n-1或者 n-2级跳上来,n-1,n-2级则以此类推; 而跳上1级的方式只有一种,跳上2级的方式有2种,所以有: f(n) = f(n-1) + f(n-2) 且f(1) = 1 , f(2) = 2; 有这几个条件就可以用递归的方式来分析问题了,它就类似于斐波那契数列,但是实现建议用循环来实现。
矩形填充:
用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用8个2*1的小巨矩形去覆盖一个2*8的矩形总共有多少种方法?
分析:
因为2*1*8 = 2*8,所以8个小矩形都会被用到,但是填充的方式不同而已。对于2*8的矩形,如果竖着填充一块,则剩余2*7个可以有各种填充方式; 对于2*8的矩形,如果横着填充一块,则必须横着再填充一块才能把下方填充,因此剩余2*6个可以有各种填充方式,。 假设2*8的填充方式为f(8),则f(8) = f(7)+f(6),且f(1) = 1, f(2) = 2。 这又是一个递归的问题。