递归--斐波那契/青蛙跳台阶/矩阵填充

博客介绍了斐波那契数列的递归和循环实现,分析递归实现的时间复杂度及重复节点问题,建议用循环实现。还探讨青蛙跳台阶和矩形填充问题,二者都类似斐波那契数列,可用递归分析,建议用循环实现代码。

斐波那契:

    递归实现:

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。  这又是一个递归的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值