在Java中,递归方法总是比迭代方法更好吗?[已关闭]

2022-09-01 05:51:03

在Java中,递归方法总是比迭代方法更好吗?

此外,它们是否可以始终用于代替迭代,反之亦然?


答案 1

在java中,递归方法总是比迭代方法更好吗?

此外,它们是否可以始终用于代替迭代,反之亦然?

总是可以从递归函数创建一个迭代函数(如果内存可以处理它,请参阅此处的有趣链接)。

在某些情况下,最好使用递归(例如在处理树时......在二叉树上旅行等)。对我来说,如果使用循环并不比递归更复杂,也困难得多,我更喜欢使用循环。

递归使用更多的内存,但有时更清晰,更具可读性。使用循环可以提高性能,但递归有时对程序员(及其性能)更好。

因此,对于结论,决定使用什么 - 递归或迭代,取决于你想要实现什么,以及对你来说更重要的东西(可读性,性能......),并且要求递归或迭代就像要求优雅或性能一样。


考虑阶乘的以下两实现:

迭 代:

private int Factorial(int num)
{
    int result = 1;
    if (num <= 1) 
       return result;
    while (num > 1)
    {
        result * = num;
        num--;
    }
    return result;
}

递归:

private int Factorial(int num)
{
    if (num <= 1) 
        return 1;
    return num * Factorial(num - 1);
}

哪种方法更具可读性?

显然是递归的,它是直截了当的,可以编写并从第一次尝试成功运行 - 它只是将数学定义翻译成!Java

哪种方法更有效?

以这里为例,这里有一个时间比较num = 40

long start = System.nanoTime();
int res = Factorial(40);
long end = System.nanoTime();
long elapsed = end - start;
        
System.out.println("Time: " + elapsed); 

2993 表示递归

2138 用于迭代

当然,当差异更大时,差异会更大。num


答案 2

递归有利于程序员理解程序,但很多时候它们会导致堆栈溢出,因此总是更喜欢迭代而不是它们

事实是,递归很少是解决问题的最有效方法,迭代几乎总是更有效。这是因为由于调用堆栈在递归期间被大量使用,因此通常与进行递归调用相关的开销更多。
这意味着许多计算机编程语言将花费更多的时间来维护调用堆栈,然后它们将实际执行必要的计算。

递归是否比迭代使用更多的内存?一般来说,是的。这是因为调用堆栈的广泛使用。

我应该使用递归还是迭代?

递归通常被使用,因为它更容易实现,并且通常比迭代解决方案更“优雅”。请记住,在递归中完成的任何事情也可以通过迭代方式完成,但是使用递归通常存在性能缺陷。但是,根据您尝试解决的问题,性能缺陷可能非常微不足道 - 在这种情况下,使用递归是有意义的。通过递归,您还可以获得其他程序员可以更轻松地理解您的代码的额外好处 - 这总是一件好事。


推荐