对于这个递归方法,我绘制一个递归跟踪,以确定recTest(a,0,4)是否返回true或false。

public class Main {

    public static boolean recTest(int[] a, int i, int j){
        if(i>=j) return true;
        else if(a[i] > a[i+1]) return false;
        return recTest(a, i+1, j);

    }

    public static void main(String[] args) {

        int[] a = {3,6,8,7,9};
        System.out.println(Main.recTest(a,0,4));
        System.out.println(Main.recTest(a,1,4));
        System.out.println(Main.recTest(a,2,4));
        System.out.println(Main.recTest(a,3,4));
        System.out.println(Main.recTest(a,4,4));
    }

}

我拿到这个(当我亲手做的时候):
recTest(a,0,4) calls recTest(a,1,4)
recTest(a,1,4) calls recTest(a,2,4)
recTest(a,2,4) calls recTest(a,3,4)
recTest(a,3,4) calls recTest(a,4,4)
recTest(a,4,4) returns true [base case]

因此,我认为recTest(a,0,4)同样会返回true(因为递归的“最低值”返回true)。但没有。这是我画出来后收到的输出:
false
false
false
true
true

请解释一下这里到底发生了什么。

最佳答案

你的分析是这样的:

recTest(a,2,4) calls recTest(a,3,4)

由于a[2]大于a[3]recTest()返回false而不是再次调用自身。
通过使用调试器单步执行代码,您可以很容易地发现这一点。

09-03 17:52