C++编译器的递归深度与程序优化思考
2013-04-18 16:33
246 查看
递归算法具有程序容易编写的特点;然而,由于编译器预分配堆栈空间的限制,递归深度并不是无限制的。
在递归过程中,系统将对当前程序运行状态保存(压入堆栈),并将参数压栈,然后递归。
在递归完成后,则做出栈操作。
当递归深度很深时,由于堆栈满,递归无法继续。
那么,递归深度到底是多少呢?如果我们创建无参数传递的递归,是否会更节省内存,从而,加大递归深度呢?
程序:测试C++编译器的递归深度
从上述程序似乎可以看出,在确定的编译器及编译参数下,不同参数传递方式似乎对递归深度没有太大影响。
问题:到底是编译器对递归深度有限制?还是内存不够用了?
结果:递归算法应慎用!
在递归过程中,系统将对当前程序运行状态保存(压入堆栈),并将参数压栈,然后递归。
在递归完成后,则做出栈操作。
当递归深度很深时,由于堆栈满,递归无法继续。
那么,递归深度到底是多少呢?如果我们创建无参数传递的递归,是否会更节省内存,从而,加大递归深度呢?
程序:测试C++编译器的递归深度
/* 测试C++语言的递归深度 G++结果: F: 43273 F1: 43273 F2: 43266 VC2012结果: F:85588 F1:44998 F2: 42773 */ #include <iostream> using namespace std; int n; int times = 0; void F() { if (n == 1) return; else { cout << times++ << endl; n = n - 1; F(); } } void F1(int n) { if (n == 1) return; else { cout << times++ << endl; n = n - 1; F1(n); } } typedef struct data { int a, b; } Data; void F2(int n, Data data) { if (n == 1) return; else { cout << times++ << endl; n = n - 1; F2(n, data); } } int main() { n = 1e6; //F(); //F1(n); Data data; F2(n, data); cout << "end"; return 0; }
从上述程序似乎可以看出,在确定的编译器及编译参数下,不同参数传递方式似乎对递归深度没有太大影响。
问题:到底是编译器对递归深度有限制?还是内存不够用了?
结果:递归算法应慎用!
相关文章推荐
- C++编译器的递归深度与程序优化思考
- C++编译器的递归深度与程序优化思考
- 不同的参数传递方式对递归函数递归深度的影响
- 二叉树的插入,递归遍历和深度节点数
- (三)卷积递归深度学习在3D物体分类中的应用(译文)
- [LeetCode系列] 二叉树最大深度求解问题(C++递归解法)
- 二叉树的深度,递归和非递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- java基础知识回顾之javaIO类--File类应用:递归深度遍历文件
- 图的深度优先和广度优先算法(DFS递归与非递归)
- 求二叉树的深度,递归与非递归算法
- 基于深度优先的递归判断域用户是否是某个组的成员
- 蓝桥杯_算法提高_排列数(深度搜索、递归)
- 递归深度实战
- 非递归深度优先遍历树结构数据
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 递归求二叉树的深度
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 传输速率的比较 快排的最好和最坏的时间复杂度比较 递归深度的问题 ackerman函数
- 摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。