是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?

  • 本文关键字:递归 程序 是什么 C++ 观点 性能 是否 重写 c++
  • 更新时间 :
  • 英文 :


只是想在这个问题上做一些 gyan,从性能的角度来看,也请解释一下堆栈和阿克曼函数如何/为什么可能参与其中,是否可以每次使用它C++? 因为在我看来,每个递归程序确实有一个非递归实现。

您可以非递归地实现几乎所有递归程序,但在某些程序中,使用递归可能会带来更好的性能。如果你真的想确保你的解决方案是最快的,我会使用 chrono 库并创建 2 个时间戳来衡量递归函数与非递归函数需要多长时间。

大多数涉及循环的问题都可以使用递归来解决。 因此,它们被分组为一种特殊类型,即原始递归。 然后是不属于这一类的问题。其中一个例子是著名的阿克曼函数。有一些问题,递归可能是一种更好的方法,例如河内塔问题。如果没有递归,解决它将非常困难。 同样,有时你最好使用循环,因为递归会为每个进程调用一个堆栈,很多时候会重复计算同一件事,有时可能会因为堆栈的大小而出现堆栈溢出。例如,当您尝试使用递归实现斐波那契级数时。因此,这取决于您要采取哪种方法的问题。递归可以通过用记忆来补充它来优化,您将在备忘录中保存计算(因此称为记忆(,以便此后无需计算它。

互联网上有大量的资源可以讨论递归与迭代讨论,例如这里和这里。

对于像 C/C++ 这样的语言,只有当满足以下某些(而不是大多数(条件时,我才会选择递归:

  • 只有在完成整个过程后才需要结果

  • 每次迭代的重复动态内存分配或调整大小是 相当苛刻

  • 算法复杂性导致迭代实现出现问题

性能:在大多数情况下,迭代可能是高性能的,但您必须对这两种实现进行计时才能做出决定。

希望这有助于您做出决定

最新更新