Ruby中递归的代价是什么?

Ruby中递归的代价是什么?,ruby,recursion,Ruby,Recursion,我有一个永远运行的ruby服务,我想知道递归的代价是什么。当我在一段时间后按住ctrl-c键关闭服务时,会打印以下错误: ^Cff.rb:169:in `sleep': Interrupt from ff.rb:169:in `fetch' from ff.rb:170:in `fetch' from ff.rb:187:in `fetch' from ff.rb:180:in `fetch' from ff.rb:170:in `fetch' f

我有一个永远运行的ruby服务,我想知道递归的代价是什么。当我在一段时间后按住ctrl-c键关闭服务时,会打印以下错误:

^Cff.rb:169:in `sleep': Interrupt
    from ff.rb:169:in `fetch'
    from ff.rb:170:in `fetch'
    from ff.rb:187:in `fetch'
    from ff.rb:180:in `fetch'
    from ff.rb:170:in `fetch'
    from ff.rb:187:in `fetch'
    from ff.rb:177:in `fetch'
    from ff.rb:170:in `fetch'
 .... and continue for each recursive call

这让我想知道这是内存消耗还是最终会失败?像这样在Ruby中使用递归是否不好?另一种解决方案会更好吗?泰

另外,Ruby从不将尾部调用递归变成循环。如果继续递归调用函数,最终会耗尽内存。

顺便说一句,Ruby永远不会将尾部调用递归变成循环。如果继续递归调用函数,最终会耗尽内存。

我不认为“递归性”是一个词。看起来你需要一个循环而不是递归调用。递归并不打算永远运行得更深,不管它是Ruby、C还是其他任何东西。@JacobRelkin它是开的,所以它必须是真的;)@grm:当然,这需要内存开销——堆栈不断增长。不过,这并没有使递归从根本上变得糟糕——只是糟糕的是,没有“停止它!”条件。但这并不意味着在这种情况下应该使用递归;我们不知道。你听说过“选择不被破坏”,对吗?我不认为“递归性”是一个词。看起来你需要一个循环而不是递归调用。递归并不打算永远运行得更深,不管它是Ruby、C还是其他任何东西。@JacobRelkin它是开的,所以它必须是真的;)@grm:当然,这需要内存开销——堆栈不断增长。不过,这并没有使递归从根本上变得糟糕——只是糟糕的是,没有“停止它!”条件。但这并不意味着在这种情况下应该使用递归;我们不知道。你听说过“选择不被破坏”这句话,对吗?让YARV支持尾部调用优化是可能的。看看有没有可能使YARV支持尾部调用优化。看见