递归和迭代

时间:2010-04-05 04:59:03

标签: recursion iteration

有什么区别?这些都一样吗?如果没有,有人可以举个例子吗?

MW: 迭代-1:迭代或重复的动作或过程:作为:一个过程,其中一系列操作的重复产生连续接近期望结果的结果b:一系列计算机指令的重复指定次数或直到满足条件

Recusion - 3:一种计算机编程技术,涉及使用一个或多次调用自身的过程,子程序,函数或算法,直到满足指定条件,此时每次重复的其余部分从最后一次处理一个叫到第一个

7 个答案:

答案 0 :(得分:8)

我们可以从recursive and iterative processes区分(如在SICP中所做的)递归和迭代过程。前者如您的定义所述,其中递归与数学recursion基本相同:recursive procedure是根据其自身定义的。迭代过程使用循环语句重复代码块。然而,递归过程是一个非常量(例如O(n) or O(lg(n)) space)执行的过程,而迭代过程则需要O(1)(常量)空间。

对于数学例子,Fibonacci数是递归定义的:

Fibonacci function

Sigma notation类似于迭代:

harmonic number

Pi notation。类似于一些(数学)递归公式可以被重写为迭代公式,一些(但不是全部)递归过程具有迭代等价物。通过跟踪您自己的数据结构中的部分结果,而不是使用函数调用堆栈,可以将所有递归过程转换为迭代过程。

答案 1 :(得分:2)

根据您提到的定义,这两个是非常不同的。在迭代中,没有自调用,但在递归中,函数调用自身

例如。因子计算的迭代算法

fact=1
For count=1 to n
fact=fact*count
end for

递归版

function factorial(n)
if (n==1) return 1
else
n=n*factorial(n-1)
end if
end function

一般

递归代码更简洁但使用更大量的内存。有时递归可以使用dynamic programming.

转换为迭代

答案 2 :(得分:2)

[快点并特朗普!]

一个表单可以转换为另一个表单,但有一个值得注意的限制:许多“流行”语言(C / Java /普通Python)不支持TCO / TCE(尾部调用优化/每次方法以递归方式调用自身时,使用递归将“向堆栈中添加额外的数据”。

所以在C和Java中,迭代是惯用的,而在Scheme或Haskell中,递归是惯用的。

答案 3 :(得分:1)

这是一个用于查找列表长度的Lisp函数。这是递归的:

(defun recursive-list-length (L)
  "A recursive implementation of list-length."
  (if (null L)
      0
    (1+ (recursive-list-length (rest L)))))

它显示“如果列表为空,则列表的长度为0,或者1加上以第二个元素开头的子列表的长度。”

这是strlen的实现 - C函数查找以空字符结尾的char*字符串的长度。它是迭代的:

size_t strlen(const char *s)
{
    size_t n;

    n = 0;
    while (*s++)
        n++;
    return(n);
}

你的目标是重复一些操作。使用迭代,您使用显式循环(如while代码中的strlen循环)。使用递归,您的函数使用(通常)较小的参数调用自身,依此类推,直到满足边界条件(上面代码中的null L)。这也重复了操作,但是没有明确的循环。

答案 4 :(得分:1)

递归: 例如:以斐波纳契系列为例。要获得任何斐波纳契数,我们必须知道前一个。因此,你将对每个数字的操作(同一个)进行操作(同一个),并且每次调用相同的方法。

fib(5)= Fib(4)+ 5

fib(4)= Fib(3)+4 。 。 即重用方法fib

迭代循环就像你加上1 + 1 + 1 + 1 + 1(迭代加法)得到5或3 * 3 * 3 * 3 * 3(迭代乘法)得到3 ^ 5。

答案 5 :(得分:0)

对于上述的一个很好的例子,考虑用于深度优先搜索的递归v。迭代过程。它可以通过递归函数调用使用语言功能完成,也可以使用堆栈在迭代循环中完成,但该过程本质上是递归的。

答案 6 :(得分:0)

递归与非递归之间的区别; 递归实施有点更容易验证的正确性;的非 递归实现有点更高效

Algorithms (4th Edition)