【问题标题】:Recursive vs non-recursive [duplicate]递归与非递归[重复]
【发布时间】:2023-12-08 15:30:01
【问题描述】:

可能重复:
Recursion and Iteration

递归函数和非递归函数有什么区别?准确地说是斐波那契。

我正在寻找与时间和记忆有关的答案。

【问题讨论】:

标签: recursion non-recursive


【解决方案1】:

“递归”仅仅意味着一个函数调用自己。这可能是有意的,也可能不是(无意的递归会导致大量崩溃)。

故意递归,其中一个函数执行部分操作,然后调用自己执行剩余部分,通常是一种有用的编程范例,但需要一定程度的理解/经验/技能才能“理解它”。

基本上,递归可用于替换“迭代”(循环)并替换伴随的数组分配(使用函数体的局部变量)。但并不是每个迭代或使用数组的函数都可以有效地转换为其等效的递归。

如果该问题适合递归,通常可以编写一个递归版本,其执行效率与非递归版本大致相当……取决于效率如何,可能会稍好或稍差调用机制与语言/编译器中的循环和数组索引进行比较。在存储方面,递归很少有效率更高,但它受益于不必为手头的特定问题预先分配(并且预先知道分配的大小)。

大多数情况下递归更好(实际上是递归),因为它使实现更简单,更不容易出错,而错误是迄今为止计算中最大的成本。 (当然,如果操作不当也会花费您大量时间。)

当递归很好时,它非常好。当递归很糟糕时,它非常糟糕。

【讨论】:

  • 所以时间不受影响?内存呢?
  • 两者都有影响,只是影响无法预料。在简单的情况下,递归的内存要高得多,因为每次调用都会产生堆栈帧开销。但是对于复杂的情况,“以防万一”分配大型数组的需要被消除了。
【解决方案2】:

递归函数是用编程语言实现的过程或子例程,其实现引用自身。

非递归函数是用编程语言实现的过程或子例程,其实现不引用自身

以下是递归和非递归斐波那契数列的链接:- Recursive and Non Recursive Fibonacci Series

【讨论】:

  • 好的,现在告诉我:这些 - function a(x) { return x ? b(x-1) : 0; } function b(x) { return x ? a(x-1) : 0; } - 是递归的吗?
  • 我不同意。我可以开发一个用给定编程语言编写的函数,它调用用不同编程语言编写的函数,并且两种实现都引用“其他”函数。结果:递归引用,在每个函数的实现中不可见。这是一个间接递归。
  • @raina77ow,正确,您甚至不必使用不同的语言。递归的。间接的。