我想知道在java应用程序中使用或创建递归函数可能带来的好处。所以,请告诉我它在哪里有用,我们可以获得递归调用的好处。但我认为,它需要更多的处理时间那么,为什么我们在JAVA应用程序中使用递归调用?
答案 0 :(得分:5)
有时递归可以帮助您设计更简单,更易读的代码。它尤其适用于递归数据结构(如树)或递归算法。
优点是您不必在每次迭代时保留状态。 JVM以调用堆栈的形式为您完成。
递归的缺点是它需要更多资源,其深度受JVM限制。
答案 1 :(得分:4)
使用递归函数只是因为对于许多算法来说,它们是实现它们的自然方式。
一个很好的例子是factorial()
函数:
function factorial(n) {
if (n <= 1) {
return 1; // terminates the recursion
} else {
return n * factorial(n - 1);
}
}
在许多情况下,如果递归调用是函数采取的最后一个操作(&#34;尾递归&#34;),则可以轻松地使用迭代函数。上面的factorial()
函数可以这样写:
function factorial(n) {
var f = 1;
for (var i = 2; i < n; ++i) {
f *= i;
}
return f;
}
递归函数的性能通常不比迭代函数差,除非递归调用树非线性增长。
一个例子是Fibonacci序列 - f(n) = f(n - 1) + f(n - 2)
。
function fib(n) {
if (n <= 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
由于每次调用函数时它都会递归两次,因此它不如简单地从1迭代到n
那样高效 - 递归版本的复杂性至少为O(2^n)
而迭代版本为O(n)
。
答案 2 :(得分:2)
热门示例包括binary search和quicksort。两者都是divide and conquer algorithms。
如果您不使用递归,则必须在外部数据结构(堆栈)上进行自我记录。在上述情况下,状态信息保留在调用堆栈上,您不需要额外的管理。所以在某些情况下,它们会带来优雅和高性能的实现。
答案 3 :(得分:1)
通常,当使用递归实现时,算法看起来更清晰(例如Fibonacci序列)。
递归非常危险,应该经过充分测试。在正常的应用程序中,没有理由使用递归,因为它可能导致问题。
答案 4 :(得分:1)
是的,它需要更多的处理时间和更多的内存。但是有时会出现递归是最好的方式。
例如,如果您需要获取目录的完整树并将其存储在某处。您可以编写循环,但它会非常复杂。如果您使用递归,它将非常简单。您只能获取根目录的文件,存储它们并为root中的每个子目录调用相同的函数。
答案 5 :(得分:1)
递归函数与普通函数没什么区别!
使用递归函数与非递归函数的动机是递归解决方案通常更容易阅读和理解。
一个例子是Fibonacci数函数。
警告:需要考虑良好的退出条件,否则错误的递归会产生堆栈溢出异常。
答案 6 :(得分:1)
递归是一种干净而巧妙的方法,可以制作易于阅读的简短方法和函数。与其他语言相比,Java在处理递归方面没有太大区别。
某些应用程序(如树搜索,目录遍历等)非常适合递归。
缺点是您可能需要一点时间来学习如何使用它,并且您可能需要更长时间来调试错误。如果迭代很大,递归可能会导致内存问题。
答案 7 :(得分:0)
我只使用递归导致代码量大大减少。例如,您希望通过绘制越来越小的线来生成树的经典树分形。使用递归,你可以使代码比大多数只使用循环结构的代码快得多,并且因为每个递归都有局部变量,所以变量较少。但那只是我的意见。