如果/ else语句显示

时间:2016-02-21 01:48:24

标签: 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");
             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)语句,所以它应该停止,这就是我的想法。

请帮我解决这里的过程和逻辑! 我很困惑......

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在else块中:

id_rsa.pub

即使您以递归方式调用r(x-1),该方法中也没有任何内容退出程序或阻止r()方法完成,以及下一行打印“bad”无法运行。

答案 2 :(得分:0)

你正在递归地调用r()。在第一次迭代中,您将它转到最后一个,其中:

  1. 打印“好”
  2. 将x减1 //(x = 2)
  3. 致电r(2)
  4. 因为r(2)被调用,你对r(3)的原始调用被放在堆栈上,它将继续执行:

    打印“坏”

    当r(2)返回控制

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

答案 3 :(得分:0)

给出函数r(int x)和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.因此程序打印“坏”3次。

答案 4 :(得分:0)

你的r(x)方法调用:

argument| x=1    | x=9  | other
--------+--------+------+--------------
  code  | hello  | bye  | good
        | r(10)  |      | r(x-1)
        |        |      | bad

所以你的调用看起来像是

r(3);

good
r(2); //because r(3-1)
bad

r(2);调用的地方:

good
r(1);  //because r(2-1)
bad

r(1);调用的地方:

hello
r(10);

r(10);调用的地方:

good
r(9);  //because r(10-1)
bad

r(9);调用的地方:

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)