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))
是否总是可以为每个递归函数编写非递归形式?
是的。一个简单的形式证明是,微递归和非递归演算(如GOTO)都是图灵完备的。由于所有的图灵完备演算在表达能力上是严格等价的,所以所有的递归函数都可以用非递归图灵完备演算来实现。
不幸的是,我无法在网上找到一个好的,正式的GOTO定义,所以这里有一个:
GOTO程序是在寄存器机器上执行的命令序列P,这样P是以下其中之一:
HALT,停止执行
R = R + 1,其中R是任意寄存器
R = R - 1,其中R是任意寄存器
GOTO x,其中x是一个标签
IF r≠0 GOTO x,其中r是任意寄存器,x是一个标签
一个标签,后面跟着上面的任何命令。
然而,递归函数和非递归函数之间的转换并不总是简单的(除非手动重新实现调用堆栈)。
欲了解更多信息,请参阅这个答案。