Recursion 递归与迭代的区别

Recursion 递归与迭代的区别,recursion,iteration,Recursion,Iteration,有什么区别?这些是一样的吗?如果没有,有人能给我举个例子吗 兆瓦: 迭代-1:迭代或重复的动作或过程:如a:一系列操作的重复产生的结果逐渐接近预期结果的过程b:计算机指令序列的重复指定次数或直到满足条件为止 递归-3:一种计算机编程技术,涉及使用一个过程、子例程、函数或算法,该过程、子例程、函数或算法调用自身一次或多次,直到满足一个指定的条件为止,在这个条件下,每个重复的剩余部分将从最后一次调用到第一次执行。它是递归的: (defun recursive-list-length (L) "A

有什么区别?这些是一样的吗?如果没有,有人能给我举个例子吗

兆瓦: 迭代-1:迭代或重复的动作或过程:如a:一系列操作的重复产生的结果逐渐接近预期结果的过程b:计算机指令序列的重复指定次数或直到满足条件为止


递归-3:一种计算机编程技术,涉及使用一个过程、子例程、函数或算法,该过程、子例程、函数或算法调用自身一次或多次,直到满足一个指定的条件为止,在这个条件下,每个重复的剩余部分将从最后一次调用到第一次执行。它是递归的:

(defun recursive-list-length (L)
  "A recursive implementation of list-length."
  (if (null L)
      0
    (1+ (recursive-list-length (rest L)))))
其内容为“如果列表为空,则列表的长度为0,或者1加上从第二个元素开始的子列表的长度)

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

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

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

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

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

例如,阶乘计算的迭代算法

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
大体上


递归代码更简洁,但占用的内存更大。有时可以使用

[快点,特朗普!]

一种形式可以转换为另一种形式,但有一个明显的限制:许多“流行”语言(C/Java/normal Python)不支持TCO/TCE(尾部调用优化/尾部调用消除),因此每次方法递归调用自身时,使用递归将“向堆栈添加额外数据”

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

我们可以区分(就像在SICP中所做的那样)来自的递归和迭代过程。前者如您的定义所述,其中递归与数学基本相同:a是根据自身定义的。迭代过程使用循环语句重复代码块。然而,递归过程是采用非常量的过程(例如)执行时,迭代过程占用O(1)(常量)空间

对于数学示例,斐波那契数是递归定义的:

类似于迭代:


与某些(数学)递归公式可以重写为迭代公式的方式类似,有些(但不是全部)递归过程具有迭代等价项,所有递归过程都可以通过跟踪在自己的数据结构中的部分结果而不是使用函数调用栈来转换成迭代的。语言功能通过递归函数调用实现,或在使用堆栈的迭代循环中实现,但该过程本质上是递归的。

递归: 例如:以斐波那契数列为例。要得到任何斐波那契数,我们必须知道前面的一个。因此,你将对小于给定值的每个数进行运算(相同的一个),并且每个数调用相同的方法

fib(5)=fib(4)+5

fib(4)=fib(3)+4 . . i、 e重用方法fib


迭代是循环的,就像你加1+1+1+1(迭代相加)得到5或3*3*3*3*3(迭代相乘)得到3^5一样。

关于递归和非递归的区别; 递归实现更容易验证的正确性;非- 递归实现的效率要高一点


我喜欢这个答案的大部分,但我不同意递归意味着非常量空间。比较“直接“和尾部递归方法。根据上面的定义,链接中的尾部递归函数不是递归的:-/@pst:我认为您没有抓住要点。使用尾部递归的函数是递归过程并生成迭代过程。递归过程根据定义使用非常量空间。@outis:不太明白。。。首先,你说r&i程序不同于r&i过程。一个在空间中是恒定的,另一个不是。明白了。然后你们说迭代过程是循环的,而迭代过程在空间中是恒定的。i过程和i过程之间的区别是什么?循环可以是恒定的,但不一定是恒定的。@CoR:请再仔细阅读我的答案。空间使用的差异是递归和迭代过程之间的差异,而不是过程和过程之间的差异(这里,空间和时间复杂性是过程的属性,而不是过程)。迭代过程和迭代过程之间的区别基本上与过程和过程之间的区别相同,但需要注意的是,术语“迭代”在每个上下文中的定义最多是间接相关的(递归过程可以生成迭代过程,反之亦然)不同的是递归给了你一个堆栈,而不需要要求一个。迭代使您在需要时请求一个。其他的一切都很奇怪。