在理解此特定代码的递归过程时,我有些麻烦。
public static void testMethod(int n){
if(n > 0){
testMethod(n-1);
System.out.print("A");
testMethod(n-1);
System.out.print("B");
}
}
例如,如果在我的主要方法中输入
testMethod(2);
该代码的输出是:
ABAABB
。在我的脑海中,我认为这段代码将一直运行到
n=0
使其跳过if
语句,但总共运行3次并每次输出AB
。显然,我没有正确地考虑这一点。如果有人可以引导我了解为什么这是
ABAABB
而不是类似ABABAB
的原因,我将不胜感激! 最佳答案
关键是要确保,一旦调用了递归,该子调用中的所有指令都将在父代中的其余指令执行之前执行。在您的代码中有两次对(n-1)的递归调用,每次打印之前一个。
让我们尝试可视化testMethod(2)的调用堆栈:
n = 2> 0,则主堆栈为:
1. testMethod(1); // 2- 1
2. System.out.print("A");
3. testMethod(1); // 2 - 1
4. System.out.print("B");`
现在让我们考虑子调用testMethod(1)
n = 1> 0,堆栈为testMethod(1); =>
testMethod(0); // 1-1
System.out.print("A");
testMethod(0); // 1 -1
System.out.print("B");`
由于testMethod(0);什么都不做(0不是> 0),我们可以删除testMethod(0)来简化testMethod(1)的堆栈; =>
System.out.print("A");
System.out.print("B");`
现在让我们将其替换回主堆栈中,作为testMethod(2)=>
1.1 System.out.print("A");//-----
//-----> testMethod(1)
1.2 System.out.print("B");`//----
2. System.out.print("A");
3.1 System.out.print("A");//-----
//-----> second testMethod(1)
3.2 System.out.print("B");`//----
4. System.out.print("B");`
然后按顺序打印出ABAABB
干杯!