iteration
和recursion
之间有什么区别?为什么/何时更好:
while (true) {
// Iterating
}
和
private void recursion() {
if (true)
recursion(); // Recursing
return;
}
我看到很多recursive
实现,而它可以在一个简单的循环中轻松完成。
答案 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
答案 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)
<强>递归强>
<强>迭代强>
取自here的数据。