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))

当前回答

有时候替换递归要简单得多。在20世纪90年代,递归曾经是计算机科学中很流行的东西,所以当时很多普通的开发人员认为,如果你用递归来解决问题,这是一个更好的解决方案。所以他们会使用递归而不是反向循环,或者类似的愚蠢的东西。所以有时候移除递归是一种简单的“这很明显”的练习。

现在这已经不是什么问题了,因为时尚已经转向了其他技术。

其他回答

有时候替换递归要简单得多。在20世纪90年代,递归曾经是计算机科学中很流行的东西,所以当时很多普通的开发人员认为,如果你用递归来解决问题,这是一个更好的解决方案。所以他们会使用递归而不是反向循环,或者类似的愚蠢的东西。所以有时候移除递归是一种简单的“这很明显”的练习。

现在这已经不是什么问题了,因为时尚已经转向了其他技术。

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

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

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

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

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

递归不只是在堆栈上调用相同的函数,一旦函数消亡,它就会从堆栈中删除。因此,总是可以使用显式堆栈来管理使用迭代的相同操作的调用。 所以,所有递归代码都可以转换为迭代。

是的,显式地使用堆栈(但恕我直言,递归读起来要舒服得多)。

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