如何在无限递归中避免堆栈溢出?

时间:2014-01-01 13:36:52

标签: c++ functional-programming

我正在尝试用c ++模拟函数式编程,我正在坚持“等待”函数,假设我想等待100秒而不使用任何类型的循环,只是递归。如何避免Stack Overflow?

3 个答案:

答案 0 :(得分:2)

调用tail-recursive并希望编译器重用堆栈帧。虽然我不认为C ++编译器需要执行此优化,但您所能做的就是依靠实现。

但是,为什么这样做只需this_thread::sleep_for()

答案 1 :(得分:2)

我认为真正的问题应该是:

  

如Scheme和Haskell这样的函数式编程语言如何使用递归来实现循环而不会导致堆栈溢出?

答案是:他们使用一种叫做tail-recursion的技巧将递归调用转换为goto。所以你必须找到一个实现尾递归的C ++编译器,或者在你的代码中模拟它。

这是一个让你了解尾递归如何工作的例子:

countdown x = if x == 0
                then 0
                else countdown (x - 1)

countdown 1000000

请注意,在递归步骤中,它只是使用不同的参数调用函数,然后返回其值。所以编译器通过将其转换为类似的代码来“欺骗”:

int countdown(int x) {
  start:
  if (x == 0) return 0;
  x = x - 1;
  goto start;
}

顺便说一句,如果你必须编写代码来利用尾递归。它不只是自动工作。更多信息请访问:What is tail recursion?

答案 2 :(得分:0)

使用分支递归。想想一个非常不理想的递归斐波纳契程序。它们具有指数运行时间与所需的堆栈深度。