在Java中,哪个更快,同时使用递归方法?

2022-09-02 14:17:04

我有以下两种方法的示例:class

流程.java:

public class Process {

    public Process() {
    }

    public static void countRecursive(int num) {
        System.out.println("countRecursive: " + num++);
        if (num <= 10) countRecursive(num);
        else return;
    }

    public static void countWhile(int num) {
        do System.out.println("countWhile: " + num++);
        while (num <= 10);
    }

}

主类:

public static void main(String[] args) {        

    Process.countRecursive(0);
    Process.countWhile(0);

}

输出:

countRecursive: 0
countRecursive: 1
countRecursive: 2
countRecursive: 3
countRecursive: 4
countRecursive: 5
countRecursive: 6
countRecursive: 7
countRecursive: 8
countRecursive: 9
countRecursive: 10

countWhile: 0
countWhile: 1
countWhile: 2
countWhile: 3
countWhile: 4
countWhile: 5
countWhile: 6
countWhile: 7
countWhile: 8
countWhile: 9
countWhile: 10

但我想知道建议使用哪种“技术”以及为什么。

提前致谢。


答案 1

由于方法调用开销和调用堆栈使用情况,递归速度会变慢。

Java也没有执行尾部调用优化,所以不要指望它。(尽管JVM上确实有尾部调用优化的语言,包括Clojure和Kotlin)

另一个缺点可能是如果您正在填满堆栈的风险。StackOverflowError

如果你这样做只是为了尝试一下,我建议使用VisualVM,它可以在java JDK中找到。它是一个分析器,可用于对这种情况进行基准测试(或者如果您正在使用OSS,则可以要求开源YouryKit许可证)。

请注意,我不建议仅仅为了花哨而使用递归。如果您确实需要它(例如遍历树木),请使用它。


答案 2

您应该使用时间测量来运行代码。在这里,你有100个递归/ 100个同时循环的输出:

Recursive time: 90941
While time: 5180

这清楚地表明,while 循环比递归更快。

您可以通过运行以下代码来检查我的测量结果:

public class Process {

    public Process() {
    }

    public static void countRecursive(int num) {
        num++;
        if (num <= 100) countRecursive(num);
        else return;
    }

    public static void countWhile(int num) {
        do
            num++;
        while (num <= 100);
    }

    public static void main(String[] args) {
        Long start = System.nanoTime();        
        Process.countRecursive(0);
        System.out.println("Recursive time: " + (System.nanoTime() - start));
        Long startWhile = System.nanoTime();
        Process.countWhile(0);
        System.out.println("While time: " + (System.nanoTime() - startWhile));

    }

}

推荐