C++编译器的递归深度与程序优化思考
2013-04-17 22:54
281 查看
递归算法具有程序容易编写的特点;然而,由于编译器预分配堆栈空间的限制,递归深度并不是无限制的。
在递归过程中,系统将对当前程序运行状态保存(压入堆栈),并将参数压栈,然后递归。
在递归完成后,则做出栈操作。
当递归深度很深时,由于堆栈满,递归无法继续。
那么,递归深度到底是多少呢?如果我们创建无参数传递的递归,是否会更节省内存,从而,加大递归深度呢?
程序:测试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++模板递归深度的思考
- 近期思考的对程序和系统的一些优化
- PB中TreeView控件的深度优化搜索算法程序
- MySQL 5.7 优化SQL提升100倍执行效率的深度思考
- 一个连通图,采用邻接表作为存储结构,设计一个算法从顶点v出发的深度优化遍历的非递归过程
- C++编译器的递归深度与程序优化思考
- C++编译器的递归深度与程序优化思考
- [程序人生]--深度思考比勤奋更重要
- c程序中多层if嵌套结构的几个优化方法(深度好文)
- 【Java程序优化】- 深度剖析 List 性能分析
- 深度学习(Deep Learning)读书思考四:模型训练优化
- MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)
- 一段递归程序的思考(全排列)
- 一个连通图,采用邻接表作为存储结构,设计一个算法从顶点v出发的深度优化遍历的非递归过程
- 网站优化没有深度思考,你的网站最好的只是排名
- 程序碎片- 矩阵乘法优化(dp,递归)
- PB中TreeView控件的深度优化搜索算法程序
- 数据结构-二叉树的深度(递归和非递归的实现)
- 使用智能指针优化C++类对象深度复制效率问题
- 看完《如何掌握所有的程序语言》的一些思考