每个递归函数都可以重写为迭代函数吗?

时间:2013-09-06 16:47:13

标签: recursion iteration computer-science

我心里已经有这个问题了很长时间,但我无法弄清楚答案。问题是,如果每个递归函数都有一个相同的迭代函数吗?

例如,

factorial(n) {
    if (n==1) { return 1 }
    else      { return factorial(n-1) }
}

这可以很容易地反复重写:

factorial(n) {
    result = 1;
    for (i=1; i<=n; i++) {
        result *= i
    }
    return result
}

但是还有许多其他更复杂的递归函数,所以我一般都不知道答案。这也可能是一个理论上的计算机科学问题。

2 个答案:

答案 0 :(得分:2)

是的,从理论的角度来看,递归函数总是可以写成迭代 - 这已经讨论过before。引用链接帖子:

  

因为您可以使用严格的迭代结构和仅使用递归结构的转换完整语言来构建图灵完整语言,因此这两者是等价的。

解释一下:我们知道任何可计算的问题都可以通过图灵机来解决。并且可以在没有递归的情况下构造编程语言A,这相当于图灵机。同样,可以在没有迭代的情况下构建编程语言B,与图灵机的计算能力相等。

因此,如果AB都是Turing-complete,我们可以得出结论,对于任何迭代程序,必须存在等效的递归程序,反之亦然。这是一个理论结果,因为它没有给出任何关于如何从任意迭代程序派生一个递归程序的提示,反之亦然。

答案 1 :(得分:0)

没有理论,很容易说服自己,任何递归函数都可以通过观察处理器(如Pentium)迭代运行而具有迭代等价。