2016-02-21 6 views
0

У меня есть этот вопрос, 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, программа встречается, если (x == 9) оператор, поэтому он должен остановиться, вот что я думал.

Пожалуйста, помогите мне разобраться с процессом и логикой здесь! Я так смущен ...

ответ

0
метод

Ваш г (х) вызывает:

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) 
+0

Спасибо. Теперь я это понимаю. – learnerJ

0

Вам не хватает некоторых частей выполнения программы, как при r 3, 2 и 10, программа печатает «хорошо», а затем рекурсивно вызывает r (2), r (1) и r (9) соответственно. Однако есть еще одно утверждение, которое в конечном итоге будет выполнено, когда вызываемая рекурсивная функция завершит свою работу и вернется к вызывающему методу. Эта часть будет печатать «плохо», когда r равно 10, 2 и 3 соответственно и в указанном порядке.

0

В еще блоке:

else{ 
     System.out.println("good"); 
     r(x-1); 
     System.out.println("bad"); 
     } 

Даже если вы звоните г (х-1) рекурсивно, нет ничего в этом методе, который выходит из вашей программы или предотвращает метод г() от завершения и следующая строка, в которой ваша печать «плохо» запускается.

0

Вы вызываете r() рекурсивно. На первой итерации, вы сделаете это до конца еще, где вы:

  1. печати "хорошо"
  2. декремент х 1 // (х = 2)
  3. вызова г (2)

потому, что г (2) называется, исходный вызов г (3) помещается в стек, и он будет продолжать выполнение в:

печати «плохо»

, когда r (2) возвращает управление

Следуйте той же логике по рекурсивному вызову.

0

с учетом функции r (int x) и основной.

Сначала вы начать с вызовом функции:

r(3); 

Поскольку й не равен 1 или 9, программа печатает «хорошей» и вызывает г (2);

Эта же логика повторяется, поэтому программа печатает «хорошо» и вызывает r (1);

В вызове функции r (1); x = 1, поэтому программа печатает «привет» и вызывает r (10);

Такая же логика, как и для первых r (3) и r (2), выполняется для r (10), поэтому программа печатает «хорошо» и вызывает r (9).

Когда вызывается r (9), программа печатает «bye» и не вызывает r (x).

На этом этапе программа продолжается от точки, где был вызван r (x).

При 3 вызовах r (x) x не равно 9 или 1. поэтому программа печатает «плохо» 3 раза.

Смежные вопросы