对于这个递归方法,我绘制一个递归跟踪,以确定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
而不是再次调用自身。通过使用调试器单步执行代码,您可以很容易地发现这一点。