我正在测试执行大量递归调用的算法的时序.我的程序死于大约128k的递归调用,这只需要0.05秒.我想让更多的记忆在我的分析中有更长的时间.我正在运行linux并使用gcc.是系统调用,环境变量,gcc标志,包装器还是什么?
Bri*_*ndy 28
尝试组织递归函数以进行尾递归.
也就是说,确保递归函数的最后一个操作是递归调用.通过这样做,编译器可以将其优化为简单的迭代.
尾递归将对您有所帮助,因为迭代将大大减少使用的堆栈空间.
使用尾递归,您通常会将值一直传递给UP,一次计算1个步骤.因此,当递归完成时,所有需要做的就是返回.
例:
转换以下代码:
unsigned fact(unsigned x)
{
if(x == 1)
return 1;
//--> Not tail recursive, multiply operation after the recursive call
return fact(x-1) * x;
}
Run Code Online (Sandbox Code Playgroud)
对此:
unsigned fact(unsigned x)
{
return tail_fact(x, 1);
}
unsigned tail_fact(unsigned x, unsigned cur_val)
{
if(x == 1)
return cur_val;
return tail_fact(x-1, x * cur_val);
}
Run Code Online (Sandbox Code Playgroud)
Gra*_*amS 10
Linux下的gcc没有堆栈大小编译器选项.但是,本文讨论了如何在Linux上设置堆栈大小.使用ulimit命令.
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |