数据结构-递归与循环

递归和循环

 

如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归实在函数的内部调用这个函数本身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复计算。例如求1+2+。。。+n,我们可以用递归或者循环两种方式求出结果。对应的代码如下:

int AddFrom1ToN_Recursive(int n){

	return n <= 0? 0 : n + AddFrom1ToN_Recursive(n - 1);
}

int AddFrom1toN_Iterative(int n){

	int result = 0;
	for(int i = 1; i <= n; ++i)
		result += i;

	return result;
}

 

递归的优点:递归实现的代码比基于循环实现的代码要简洁。

递归的缺点:(1)递归调用有时间和空间的消耗:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址和临时变量,而且往栈里压入数据和弹出数据都需要时间。(2)递归中有可能很多计算都是重复的。

 

9.(斐波那契额数列)写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:

f(n) = { 0, n = 0; 1, n = 1; f(n-1) + f(n-2), n > 1}

 

低效的代码:

long long Fibonacci(unsigned int n){

	if(n <= 0)
		return 0;

	if(n == 1)
		return 1;

	return Fibonacci(n - 1) + Fibonacci(n - 2);
}

 

递归树(重复计算)

      f(10)

      /   \

  f(9)      f(8)

 /   \     /  \

f(8)f(7) f(7) f(6)

...

 

 

改进的代码:

long long Fibonacci(unsigned n){
	
	int result[2] = {0, 1};
	if(n < 2)
		return result[n];

	long long fibNMinusOne = 1;
	long long fibNMinusTwo = 0;
	long long fibN = 0;

	for(unsigned int i = 2; i <= n; ++i){
		fibN = fibNMinusOne + fibNMinusTwo;

		fibNMinusTwo = fibNMinusOne;
		fibNMinusOne = fibN;
	}

	return fibN;

}

 

测试用例:

1)功能测试(如输入3510等)

2)边界值测试(如输入012

3)性能测试(输入较大的数字,如4050100等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值