reddit上的一个帖子提出了一个很有趣的问题:

尾递归函数可以简单地转换为迭代函数。其他的可以通过使用显式堆栈进行转换。每个递归都能转化为迭代吗?

文章中的(counter?)例子是:

(define (num-ways x y)
  (case ((= x 0) 1)
        ((= y 0) 1)
        (num-ways2 x y) ))

(define (num-ways2 x y)
  (+ (num-ways (- x 1) y)
     (num-ways x (- y 1))

当前回答

可以将任何递归算法转换为非递归算法 一个,但通常逻辑要复杂得多,这样做需要 堆栈的使用。事实上,递归本身使用堆栈:the 函数堆栈。

详情:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

其他回答

看看维基百科上的以下条目,你可以把它们作为一个起点,找到你问题的完整答案。

计算机科学中的递归 递归关系

下面一段话可能会给你一些提示,让你知道从哪里开始:

求解递归关系意味着获得一个封闭形式的解:n的非递归函数。

再看看这篇文章的最后一段。

递归在实际解释器或编译器中以堆栈或类似结构的形式实现。因此,您当然可以将递归函数转换为迭代函数,因为这就是它总是这样做的(如果是自动的)。您只是在以一种特别的方式复制编译器的工作,而且可能是一种非常丑陋和低效的方式。

所有可计算的函数都可以用图灵机计算,因此递归系统和图灵机(迭代系统)是等价的。

除了显式堆栈之外,另一种将递归转换为迭代的模式是使用蹦床。

在这里,函数要么返回最终结果,要么返回原本执行的函数调用的闭包。然后,初始化(蹦床)函数继续调用返回的闭包,直到达到最终结果。

这种方法适用于相互递归的函数,但恐怕它只适用于尾部调用。

http://en.wikipedia.org/wiki/Trampoline_(电脑)

是的,总是可以编写一个非递归的版本。简单的解决方案是使用堆栈数据结构并模拟递归执行。