1,2部分摘自网络,略有改动,向原作者致敬!
3.个人总结
| 定义 | 优点 | 缺点 | 递归
| 程序调用自身的编程技巧称为递归
| 1)大问题化为小问题,可以极大的减少代码量;
2)用有限的语句来定义对象的无限集合.;
3)代码更简洁清晰,可读性更好
| 1)递归调用函数,浪费空间;
2)递归太深容易造成堆栈的溢出;
| 迭代
| 利用变量的原值推算出变量的一个新值,迭代就是A不停的调用B.
| 1)迭代效率高,运行时间只因循环次数增加而增加;
2)没什么额外开销,空间上也没有什么增加,
| 1) 不容易理解;
2) 代码不如递归简洁;
3) 编写复杂问题时困难。
| 二者关系
| 1) 递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。
2) 能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出./*相对*/
|
举例如下:
[cpp]
- #include <iostream>
- using namespace std;
- //迭代实现斐波那契数列
- long fab_iteration(int index)
- {
- if(index == 1 || index == 2)
- {
- return 1;
- }
- else
- {
- long f1 = 1L;
- long f2 = 1L;
- long f3 = 0;
- for(int i = 0; i < index-2; i++)
- {
- f3 = f1 + f2; //利用变量的原值推算出变量的一个新值
- f1 = f2;
- f2 = f3;
- }
- return f3;
- }
- }
- //递归实现斐波那契数列
- long fab_recursion(int index)
- {
- if(index == 1 || index == 2)
- {
- return 1;
- }
- else
- {
- return fab_recursion(index-1)+fab_recursion(index-2); //递归求值
- }
- }
- int main(int argc, char* argv[])
- {
- cout << fab_recursion(10) << endl;
- cout << fab_iteration(10) << endl;
- return 0;
- }
|