Java If/else语句显示

Java If/else语句显示,java,computer-science,Java,Computer Science,我有这个问题,, 1) 运行以下程序时显示的内容: class Q1 { public static void main(String[] args) { r(3); } public static void r(int x) { if (x == 1) { System.out.println("hello");

我有这个问题,, 1) 运行以下程序时显示的内容:

    class Q1
    {
       public static void main(String[] args)
       {
          r(3);
       }
       public static void r(int x)
       {
          if (x == 1)
          {
             System.out.println("hello");
             r(10);
          }
          else
          if (x == 9)
             System.out.println("bye");
          else
          {
             System.out.println("good");
             r(x-1);
             System.out.println("bad");
          }
      }
   }
按照我的逻辑,结果是

good
good
hello
good
bye
但答案是

good
good
hello
good
bye
bad
bad
bad
为什么那些糟糕的底线会出现? 当最后一个r(9)被分配给x时,程序遇到if(x==9)语句,所以它应该停止,这就是我的想法

请帮我弄清楚这里的流程和逻辑!
我很困惑…

您缺少程序执行的某些部分,当r为3、2和10时,程序打印“good”,然后分别递归调用r(2)、r(1)和r(9)。但是,还有一条语句,当被调用的递归函数完成其工作并返回到调用方法时,最终将执行该语句。当r分别为10、2和3时,该部分将按该顺序打印“坏”

在else块中:

   else{
         System.out.println("good");
         r(x-1);
         System.out.println("bad");
      }
即使是递归调用r(x-1),该方法中也没有任何内容会退出程序或阻止r()方法完成,并阻止打印“坏”的下一行运行。

您是递归调用r()。在第一次迭代中,您将进入最后一次迭代,您可以:

  • 打印“好”
  • 减量x减1/(x=2)
  • 呼叫r(2)
  • 因为调用了r(2),所以对r(3)的原始调用被放置在堆栈上,它将继续在以下位置执行:

    打印“坏”

    当r(2)返回控制时

    在递归调用中遵循相同的逻辑。

    给定函数r(intx)和main

    首先从函数调用开始:

    r(3);
    
    由于x不等于1或9,程序打印“good”并调用r(2)

    同样的逻辑再次发生,因此程序打印“good”并调用r(1)

    在函数调用r(1)中;x=1,因此程序打印“hello”并调用r(10)

    对于r(10),与第一个r(3)和r(2)的逻辑相同,因此程序打印“good”并调用r(9)

    当调用r(9)时,程序打印“bye”而不调用r(x)

    此时,程序从调用r(x)的点继续

    在3次调用r(x)时,x不等于9或1。因此程序会打印“bad”3次。

    您的r(x)方法调用:

    argument| x=1    | x=9  | other
    --------+--------+------+--------------
      code  | hello  | bye  | good
            | r(10)  |      | r(x-1)
            |        |      | bad
    
    所以你的调用看起来像

    r(3)

    其中
    r(2)调用:

    good
    r(1);  //because r(2-1)
    bad
    
    hello
    r(10);
    
    good
    r(9);  //because r(10-1)
    bad
    
    bye
    
    其中
    r(1)调用:

    good
    r(1);  //because r(2-1)
    bad
    
    hello
    r(10);
    
    good
    r(9);  //because r(10-1)
    bad
    
    bye
    
    其中
    r(10)调用:

    good
    r(1);  //because r(2-1)
    bad
    
    hello
    r(10);
    
    good
    r(9);  //because r(10-1)
    bad
    
    bye
    
    其中
    r(9)调用:

    good
    r(1);  //because r(2-1)
    bad
    
    hello
    r(10);
    
    good
    r(9);  //because r(10-1)
    bad
    
    bye
    
    如果你把这些放进窝里,你会得到的

    r(3){
      good
      r(2){
        good
        r(1){
          hello
          r(10){
            good
            r(9){
              bye
            }
            bad
          }
        }
        bad
      }
      bad
    }
    
    由此产生:

            (from)
    good    r(3)
    good      r(2)
    hello       r(1)
    good          r(10)
    bye             r(9)
    bad           r(10)
    bad       r(2)
    bad     r(3)
    

    非常感谢。现在,我明白了。