在理解此特定代码的递归过程时,我有些麻烦。

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

干杯!

10-07 13:14