2012-10-17 320 views
-1

可能重复:
Recursion and Iteration递归与非递归

是什么递归和非递归函数之间的区别?斐波纳契准确。

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

+3

递归函数调用递归函数。 – raina77ow

+0

@ raina77ow,好的,但这是因为递归函数直接或间接地调用自己。 – TheBlastOne

+2

你在问什么是递归和迭代之间的区别......它已经在SO上回答了很多次,http://stackoverflow.com/questions/72209/recursion-or-iteration和http://stackoverflow.com/问题/ 2576993 /递归和迭代和http://stackoverflow.com/questions/2185532/why-should-recursion-be-preferred-over-iteration – Arham

回答

0

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

非递归函数是一种编程语言实现的程序或子程序,其实施不引用自身

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

+0

好吧,现在告诉我:这些 - 函数a(x ){return x? b(x-1):0; }函数b(x){return x? a(x-1):0; ''递归? – raina77ow

+0

我不同意。我可以开发一个用给定的编程语言编写的函数,它调用用不同的编程语言编写的函数,并且这两个实现都引用“其他”函数。结果:递归引用,在每个函数的实现中不可见。这是一个间接递归。 – TheBlastOne

+0

@ raina77ow,没错,你甚至不需要使用不同的语言。递归。间接的影响。 – TheBlastOne

1

“递归”只是手段一个函数自己调用。这可能是也可能不是有意的(无意的递归是造成大量崩溃的原因)。

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

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

如果该问题适用于递归,可以经常编写一个递归版本,该版本与非递归版本的执行效率相当......可能稍微更好或更差,具体取决于调用机制的效率如何与语言/编译器中的循环和数组索引相比。在存储方面,递归很少有效,但是它不需要为特定的问题预先分配(并且预先知道分配的大小)。

大多数情况下,递归更好(实际上是),因为它使得实现更简单,更容易出错,并且错误是计算中最大的成本。 (但是,当然,做得不当也可能花费你很大的时间。)

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

+0

那么时间不受影响?记忆如何? – dalawh

+0

两者都受到影响,只是效果不可预测。在简单情况下,递归的内存要高得多,因为每次调用都会有一个堆栈帧开销。但是对于复杂的情况,为了“万一”分配大型阵列的需求被消除了。 –