Может кто-нибудь объяснить мне логи c за эту рекурсию - PullRequest
0 голосов
/ 02 марта 2020
public int bunnyEars(int n) {
    if (n < 0) {
        throw new IllegalArgumentException();
    }
    if (n == 0) {
        return n;
    }
    if (n % 2 == 1)
       return 2 + bunnyEars(n - 1);

   return 3 + bunnyEars(n - 1);
}

Может кто-нибудь объяснить, как bunnyEars(2) = 5, а также как это работает?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Если число n меньше 0, то генерируется исключение IllegalArgumentException, о чем свидетельствуют:

if (n < 0) {
   throw new IllegalArgumentException();
}

Итак, мы знаем, что n всегда должно быть 0 или больше. Мы также знаем, что метод должен возвращаться, когда n равен 0, о чем свидетельствуют:

if (n == 0) {
    return n;
 }

Так, предположительно, метод public int bunnyEars(int n) будет принимать число, равное или большее, чем ноль, и начнет добавлять целые числа, пока n не станет равным нулю.

Мы видим два различных возможных сценария ios, которые принимают n больше нуля и что-то с ними делают:

if (n % 2 ==1)
   return 2 + bunnyEars(n-1);
return 3 + bunnyEars(n -1); //else

Что здесь происходит, если n% 2 равен единице (это означает, что число нечетное, поскольку каждое нечетное целое число, деленное на два, имеет остаток от одного), то метод вызывается рекурсивно с текущий n минус 1, а последнее целое число для возврата увеличивается на два.

Если число не нечетное (и, следовательно, четное), то происходит то же самое, но с конечным целым числом возвращаемое, увеличенное на 3.

Итак, в вашем примере bunnyEars(2) мы видим, что n из 2 является и положительным, и больше нуля, поэтому не выдается никакой ошибки, и метод не возвращается без рекурсии. Поскольку 2 - четное число (2% 2 - 0), используется второе return. Это означает, что вызывается 3 + bunnyEars (1).

Поскольку 1 также больше 0, мы go снова рекурсивные методы. Так как 1 нечетное число (1% 2 равно 1), вызывается первый рекурсивный возврат. Это означает, что мы вызываем 2 + bunnyEars (0).

Теперь, поскольку n равно 0, используется return n из оператора if:

if (n == 0) {
    return n;
 }

В первом раунде мы конечное целое число для возврата было увеличено на 3, а во второй раз оно было увеличено на 2, что в сумме составило 5. Таким образом, результат равен пяти.

1 голос
/ 03 марта 2020

Из ваших комментариев я понимаю, что вы уже знаете значение рекурсивного вызова. Чтобы понять, как это работает, вы можете каким-то образом отследить вызовы. Ниже приведен пример одного из способов:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        System.out.println(bunnyEars(2));
    }

    static int bunnyEars(int n) {
        if (n < 0) {
            throw new IllegalArgumentException();
        }
        if (n == 0) {
            System.out.println(n);
            return n;
        }
        if (n % 2 == 1) {
            System.out.print("2 + bunnyEars(" + n + "-1) -> ");
            return 2 + bunnyEars(n - 1);
        }
        System.out.print("3 + bunnyEars(" + n + "-1) -> ");
        return 3 + bunnyEars(n - 1);
    }
}

Вывод:

3 + bunnyEars(2-1) -> 2 + bunnyEars(1-1) -> 0
5

Как видите, 3 + 2 + 0 = 5 что вы получите в качестве ответа.

Надеюсь, это поможет. Не стесняйтесь комментировать в случае каких-либо сомнений.

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