Если число 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. Таким образом, результат равен пяти.