数据结构-递归与循环
2017-08-18 16:45
671 查看
递归和循环
如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归实在函数的内部调用这个函数本身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复计算。例如求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
;
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)功能测试(如输入3、5、10等)
(2)边界值测试(如输入0、1、2)
(3)性能测试(输入较大的数字,如40、50、100等)
如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归实在函数的内部调用这个函数本身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复计算。例如求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
;
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)功能测试(如输入3、5、10等)
(2)边界值测试(如输入0、1、2)
(3)性能测试(输入较大的数字,如40、50、100等)
相关文章推荐
- 数据结构和算法学习二,之循环和递归
- 数据结构-循环和递归
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 数据结构-循环和递归比较(31)
- 数据结构知识整理-递归循环打印杨辉三角
- 算法与数据结构学习 02 循环和递归
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 【郝斌数据结构自学笔记】53-56_一个函数为什么可以自己调用自己_递归必须满足三个条件_循环和递归的比较
- 数据结构——非循环带头结点单链表的递归方法逆置
- 数据结构学习-递归(2)
- 数据结构--循环链表
- 【数据结构】用C++实现单循环链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- 数据结构和算法2之递归
- 利用递归实现不定重数多重循环(附源代码)
- [数据结构][适用循环队列和非循环队列]顺序队列的实现。
- 循环遍历某个文件夹下面的所有文件,递归方法
- 初学数据结构——单向循环链表和双向循环链表。
- 递归循环获取指定节点下面的所有子节点
- 数据结构Java实现04----循环链表、仿真链表
- 【数据结构】单向循环链表实现