为什么递归引起的stackoverflow无法解决?

时间:2013-10-23 04:31:42

标签: recursion compiler-construction operating-system

任何递归都可以修改为具有堆栈结构的迭代函数,那么为什么我要这样做呢?如果答案是避免stackoverflow,那么计算机怎么会通过递归溢出?为什么编译器默认情况下不会自动在堆中的堆栈上放置递归函数或使用其他关键字?我理解堆也是有限的,但它比分配给程序的堆大得多。

3 个答案:

答案 0 :(得分:0)

激活记录确实可以堆分配,但这通常被认为太贵了。尽管有一些实现采用这种方法:例如Stackless Python和SML / NJ。

在这些情况下,动机可能是帮助实现延续,而不是“修复”堆栈溢出。

答案 1 :(得分:0)

根据C/C++ maximum stack size of programMSDN,Windows上的最大堆栈大小为1 MiB。你的问题很有趣。关键字肯定是可能的,编译器可以做到这一点。你需要向编译器制造商询问它,但我想这不是一个非常有趣的功能。

缓存很难,因为堆栈上有其他局部变量,堆上有递归簿记变量。信息分散在内存中。

一些递归算法可以转换为真正的迭代算法(如计算Factorial),甚至可以转换为闭合形式的表达式(例如参见Fibonacci numbers)。然后,不需要对递归调用进行簿记。

答案 2 :(得分:0)

在迭代过程中,您自己跟踪递归状态。

有可能你可以通过非常通用的程序机制(其效率可能受到各种ABI问题的阻碍)更高效地执行此操作。

可以进行堆栈检查,但并非所有系统都不容易,因为并非所有系统都使用固定堆栈或线性地址空间。当然,它也有开销,因为检查会添加到每个递归中。