Разрешение стеков с помощью операторов возврата - PullRequest
0 голосов
/ 14 декабря 2018

Хотя я думаю, что у меня есть четкое понимание разрешения стеков в пустых методах, методы возврата действительно портят мое понимание стеков.Следующий метод особенно смущает меня, так как я думал, что он вернет 0, но вместо этого вернет 12.

public static int mystery(int n) { // where the method call is mystery(7)
    n--; // since n is decremented before the first 
         // recursive method, the first stack is method(6)

    if(n > 0)  // base case
       mystery(n);

    return n * 2; // 0 * 2 = 0?
}

Мой вопрос заключается в том, почему метод выводит 12, когда mystery (7), если 0 - это последнее значение, которое будет помещено в стек.Разве этот метод все еще не следует за LIFO?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Это должно быть так:

public static int mystery(int n) { // where the method call is mystery(7)

n--; // since n is decremented before the first 
     // recursive method, the first stack is method(6)

if(n > 0)  // base case
   n = mystery(n);

return n * 2; // 0 * 2 = 0?
}

Теперь он всегда будет возвращать 0.

0 голосов
/ 14 декабря 2018

Давайте не будем рассматривать 7. Допустим, ваше значение равно 3. mystery(3).В этом случае функция будет запущена 3 раза.

Первый запуск:

n = 3;
n--; // n = 2
(n > 0) so mystery(2)

Второй запуск:

n = 2;
n--; // n = 1
(n > 0) so mystery(1)

Третий запуск:

n = 1;
n--; // n = 0
(n = 0) so return the n*2 . And the return will be 4

Почему?Потому что рекурсивная функция не меняет значение n

0 голосов
/ 14 декабря 2018

Изнутри:

Внутренний вызов mystery (n = 1 при входе) возвращает 0 вызывающему.Возвращаемое значение не используется.

Следующий уровень mystery (n = 2 при входе) возвращает 2 своему вызывающему.Возвращаемое значение не используется.

... и т. Д. *

Ближайший к внешнему уровень mystery (n при входе равен 6) возвращает 10 вызывающей стороне,Возвращаемое значение не используется.

Самый внешний уровень mystery (n = 7 при вводе) возвращает 12 своему вызывающему, что является окончательным возвращаемым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...