【问题标题】:Recursion Vs Iteration递归与迭代
【发布时间】:2012-04-26 17:16:04
【问题描述】:

我相信所有具有迭代逻辑的问题都可以使用迭代来解决,但是我们可以使用递归来解决任何问题吗?递归总能代替迭代吗?如果可以,请为您的答案提供证据。还假设我们有一个无限堆栈或者我们在图灵机上运行程序。我不在乎这个证明是不是理论上的证明。 (这就是我提到图灵机的原因)

【问题讨论】:

  • 有人可能会在这里纠正我,但某些语言(“纯函数式语言”)不是完全基于递归吗?例如 Lisp 语言?
  • @TonyR Lisp 语言根本不是纯粹的功能性语言。
  • 那么“函数式语言”呢?
  • @TonyR Scheme 不是纯粹的函数式。但是你是对的,所有的迭代构造都是基于递归的,并且由于尾递归得到了优化,迭代的效率是等效的。

标签: algorithm recursion iteration


【解决方案1】:

是的,递归总是可以替代迭代,这已经讨论过before。引用链接的帖子:

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

解释一下:我们知道任何可计算的问题都可以通过图灵机来解决。并且可以不用递归构造编程语言A,相当于图灵机。同样,无需迭代也可以构建编程语言B,其计算能力与图灵机相当。

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

【讨论】:

  • 谢谢 我在搜索网站时错过了这个链接
【解决方案2】:

是的。有一种递归称为tail recursion,可以直接转化为迭代。一个可以毫无问题地转换为另一个。因此,所有的迭代解都可以转化为递归解。

其实很多编译器都可以检测到你在做尾递归,然后转成for循环类型的代码来提高效率。

【讨论】:

    【解决方案3】:

    当不需要循环时应该使用递归,但该方法必须在特定情况下重复自身。例如,压缩文件夹。如果有子文件夹,它应该调用自己(递归)。如果您愿意,递归可以替代迭代,但不建议这样做。大多数人只使用迭代,只在需要时使用递归。

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 2012-08-29
      • 2021-05-26
      • 1970-01-01
      • 2015-07-18
      • 2015-02-06
      • 2011-02-08
      • 2018-12-28
      • 2012-10-05
      相关资源
      最近更新 更多