递归与循环

    若我们要重复的多次计算相同的问题,通常可以选择用递归或者循环两种方法。

int AddFrom1ToN(int n)
{
	int add = 0;
	for (int i = 1; i <= n; i++)
	{
		add += i;
	}
	return add;
}
int AddFrom1ToN(int n)
{
	if (n <= 0)
	{
		return 0;
	}
	return n + AddFrom1ToN(n - 1);
	//return n<=0?0:n + AddFrom1ToN(n - 1);
}

    通常递归的代码比较简洁,但是由于它是函数调用自身,有时间的消耗和空间的消耗,且存在栈溢出的隐患


题目:

    写一个函数,输入n,输出斐波那契数列第n项

    f(N)= 0                 N=0;

            1                 N=1;

            f(N+1)+f(N-1) N>1

程序1.0

long long Fibonacci(size_t n)
{
		if (n = 0)
			return 0;
		if (n = 1)
			return 1;
		return Fibonacci(n - 1) + Fibonacci(n - 2);
}

分析:

    1.函数返回值类型为long long,防止数字太大溢出

    2.若n过大则会导致栈溢出

程序2.0

    时间复杂度O(n)

long long Fibonacci(size_t n)
{
	if (0==n)
		return 0;
	if (1==n)
		return 1;
	long long first = 0;
	long long second = 1;
	long long result = 0;
	
	for (size_t i = 2; i <= n; i++)
	{
		result = first + second;
		first = second;
		second = result;
	}
	return result;
}

测试

  1. 功能测试,输入2,4,6,8

  2. 边界值测试,输入0,1,2

3.  性能测试,输入50,70

举一反三j_0028.gif

    1.一只青蛙跳台阶,一次可以跳一阶或两阶,计算这个青蛙跳n阶台阶有多少种跳法

分析:

    (0阶0种跳法)若为1阶,只有一种跳发,两阶,有两种跳发,三阶3种。。。。

最后可看成是斐波那契数列的另一种延伸。

  

   2.一只青蛙跳台阶,一次可以跳一阶,两阶,也可以跳n阶,计算这个青蛙跳n阶台阶有多少种跳法

经分析可得出一个数学公式 f(n)=2^(n-1)

    

    3.我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形,8个2*1的小矩形无重叠覆盖一个2*8放的大矩形,共多少种方法



    

















分析: 先把2*8的覆盖方法为f(8),用第一个1*2的小矩形去覆盖大矩形的最左边有两个选择,横着或者竖着,当竖着的时候,右边还有2*7个区域(f(7)),若横着,则剩下的区域为2*6(f(6)),所以可以得出,f(8)=f(7)+f(6),斐波那契数列问题