迭代和递归有什么区别?

时间:2013-11-05 17:10:05

标签: c++ recursion iteration

iterationrecursion之间有什么区别?为什么/何时更好:

while (true) {
    // Iterating
}

private void recursion() {
    if (true)
        recursion(); // Recursing

    return;
}

我看到很多recursive实现,而它可以在一个简单的循环中轻松完成。

7 个答案:

答案 0 :(得分:32)

递归和同一算法的迭代版本之间存在两个主要差异。

首先,有时候理解递归算法比迭代算法好几乎(至少如果你是经验丰富的程序员)所以它确实增加了表达能力,在某些情况下可以提高可读性(它也可能导致完全相反)在其他情况下)

对于编程语言而言,Expresivity是一个巨大的优势,能够用5行而不是20行编写相同的代码是一件大事。

缺点是,它会降低代码的性能。递归函数必须将函数记录保存在内存中,并从一个内存地址跳转到另一个内存地址,以调用它来传递参数和返回值。这使得他们表现非常糟糕。

总结:

迭代算法=快速性能但难以编写(有时难以阅读)

递归算法=快速编写但性能不佳(有时也更容易理解)

举个例子:

public static long fib(long n) {
    if (n <= 1) return n;
    else return fib(n-1) + fib(n-2);
}

VS

    if ((n == 1) || (n == 2)) {
        return 1;
    } else {
        long prev = 1, current = 1, next = 0;
        for (long i = 3; i <= n; i++) {
            next = prev + current;
            prev = current;
            current = next;
        }
        return next;
    }

来源:

http://www.csd.uwo.ca/Courses/CS1027a/code/FibonacciDemo.java

答案 1 :(得分:5)

递归和迭代之间的主要区别在于内存使用情况。

对于每个递归调用,需要堆栈帧上的空间,从而导致内存开销。

让我举个例子。想象一下,在一个案例中,你忘了为递归函数编写基本案例,导致无休止的递归调用,而在其他情况下,你写了一个无限循环。

由于每个递归函数都会分配新的内存空间,因此在第一种情况下,您的代码会产生堆栈溢出异常,但在第二种情况下,它会一直运行。

因此,与使用Recursion相比,更好地使迭代代码更容易理解。

答案 2 :(得分:2)

他们是做同样事情的不同方式。所有递归实现都可以使用(或多个)循环完成,反之亦然。它更多的是关于它背后的逻辑,一种思考它的方式。因子虽然不是最好的例子,但是n * (n-1)!因此以递归方式使用它是有意义的。

答案 3 :(得分:1)

递归和迭代是思考解决方案的不同方法。 要深入解释全范围的差异是很困难的。在您的示例代码中,您显示了差异。 递归函数是调用自身的函数,而迭代函数是循环遍历某些代码块的函数。 这里有一些文章可以帮助您更好地理解它们: Recursion wiki

Iteration wiki

CodeProject SO #1

SO #2

答案 4 :(得分:0)

它们可以互换使用以解决不同的问题。本质上,您可以迭代地编写递归函数,反之亦然。

迭代可能会提高程序的性能。而递归可以提供更直观和优雅的结果。您可以根据自己的喜好选择哪个!

答案 5 :(得分:0)

递归函数通过调用自身直到满足条件的过程为止,而迭代使用循环控制结构(例如while,do while,for),以便重复一段代码,直到满足某个条件。 / p>

递归示例:

int rec_func(int u, int k) {
  if (k == 0)
    return u;
  return rec_func(u * k, k - 1);
}

迭代示例:

int ite_func(int u, int k) {
  while (k != 0) {
    u = u * k;
    k = k - 1;
  }
  return u;
} 

它们之间唯一真正的区别在于编译差异。

答案 6 :(得分:-2)

递归和迭代之间的差异

<强>递归

  1. 递归函数 - 是一个由其自身部分定义的函数
  2. 递归使用选择结构
  3. 如果递归步骤没有以某种条件收敛(基本情况)的方式减少问题,则会发生无限递归
  4. 当识别基本案例时,递归终止
  5. 由于维护堆栈的开销
  6. ,递归通常比迭代慢
  7. 递归使用的内存多于迭代
  8. 无限递归可能导致系统崩溃
  9. 递归使代码变小
  10. <强>迭代

    1. 迭代指令 - 基于循环的过程重复
    2. 迭代使用重复结构
    3. 如果循环条件测试永远不会变为假,则迭代会发生无限循环
    4. 当循环条件失败时迭代终止
    5. 迭代不使用堆栈,因此它比递归更快
    6. 迭代消耗更少的内存
    7. 无限循环重复使用CPU周期
    8. 迭代使代码更长
    9. 取自here的数据。