理解递归vs循环ruby

时间:2013-08-29 05:43:16

标签: loops recursion while-loop

我有以下递归方法。我得到一个错误堆栈溢出。它停在-9352。我的问题是,堆栈溢出与无限循环相同吗?因为这将继续自称。

但是如果我用while,until,do等进行无限循环,它不会给我相同的堆栈溢出错误。它一直持续到我的系统内存不足为止。

这是使用Ruby

def recursion(n)
    print n
    recursion(n-1)
end

recursion(3)

输出:

3
2
1
0
.
.
.
-9352  stack overflow stops

1 个答案:

答案 0 :(得分:-1)

递归和循环是可以以不同方式解决类似问题的技术(如评论中所述,它们是图灵等效的,但这不是我的领域。)

每个函数调用都会向调用堆栈添加一个帧。这需要额外的内存,并且随着您的调用链越来越深入,它需要更多内存,直到超过某个限制,这会使您的堆栈overflow和您的程序崩溃。

您的递归代码会向调用堆栈添加越来越多的帧,并且在给定有限内存量的情况下,会导致它溢出。你需要一些方法告诉递归何时停止,并在内存耗尽之前这样做。这种情况等同于数学归纳中的base case,因此它通常被称为这样。

评论中指出的另一个选项是利用Tail call优化,它取代堆栈中的当前帧,因此可以防止堆栈溢出。

您的迭代解决方案只需要固定数量的内存。

只更改计数器或其他预定义变量的,因此不会产生任何内存开销。

如果你不限制输出,它理论上可以无限期地继续,但是其他一些耗尽或错误很可能会导致它被杀死。但是,这不会是循环本身使用的变量所消耗的内存。