如何在更多递归时允许更多内存并避免堆栈溢出?

Ian*_*ing 3 c linux gcc

我正在测试执行大量递归调用的算法的时序.我的程序死于大约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)

  • @rpr:不,这仍然不是尾递归.因为在递归返回之后,您仍然有一个乘法运算. (2认同)

Gra*_*amS 10

Linux下的gcc没有堆栈大小编译器选项.但是,本文讨论了如何在Linux上设置堆栈大小.使用ulimit命令.

  • 如果堆栈实际上增长那么大,它只是一个很大的足迹.仅仅因为你要求它,并不意味着它将被分配到某个地方的实际页面,直到你使用它 (2认同)