我有以下递归方法。我得到一个错误堆栈溢出。它停在-9352。我的问题是,堆栈溢出与无限循环相同吗?因为这将继续自称。
但是如果我用while,until,do等进行无限循环,它不会给我相同的堆栈溢出错误。它一直持续到我的系统内存不足为止。
这是使用Ruby
def recursion(n)
print n
recursion(n-1)
end
recursion(3)
输出:
3
2
1
0
.
.
.
-9352 stack overflow stops
答案 0 :(得分:-1)
递归和循环是可以以不同方式解决类似问题的技术(如评论中所述,它们是图灵等效的,但这不是我的领域。)
每个函数调用都会向调用堆栈添加一个帧。这需要额外的内存,并且随着您的调用链越来越深入,它需要更多内存,直到超过某个限制,这会使您的堆栈overflow
和您的程序崩溃。
您的递归代码会向调用堆栈添加越来越多的帧,并且在给定有限内存量的情况下,会导致它溢出。你需要一些方法告诉递归何时停止,并在内存耗尽之前这样做。这种情况等同于数学归纳中的base case
,因此它通常被称为这样。
评论中指出的另一个选项是利用Tail call优化,它取代堆栈中的当前帧,因此可以防止堆栈溢出。
您的迭代解决方案只需要固定数量的内存。
只更改计数器或其他预定义变量的值,因此不会产生任何内存开销。
如果你不限制输出,它理论上可以无限期地继续,但是其他一些耗尽或错误很可能会导致它被杀死。但是,这不会是循环本身使用的变量所消耗的内存。