объясните рекурсию на рабоче-крестьянском языке
имеем данный код
public class Main {
public static void main(String[] args) {
up_and_down(1);
}
public static void up_and_down(int i) {
System.out.println("уровень вверх " + i);
if (i < 3)
up_and_down(i + 1);
System.out.println("уровень вниз " + i);
}
}
и вывод
уровень вверх 1
уровень вверх 2
уровень вверх 3
уровень вниз 3
уровень вниз 2
уровень вниз 1
статьи читал, там эти факториалы, еще больше запутался.
помогите понять данное явление... я это понимаю как вложенный if, сначала прокрутились по внутреннему циклу, затем вышли во внешний. Но не могу понять почему идёт обратный отсчёт?????
Ответы (1 шт):
Вы вызываете функцию up_and_down и у вас сразу печатается 1, т.к. 1 < 3, то вы вызываете эту же функцию. И теперь функция, где i = 1 будет ждать пока вызов up_and_down(i + 1) выполнится.
В функции, где i = 2 происходит аналогичное, мы сначала печатаем 2 в консоль и т.к. 2 < 3, то вызываем функцию up_and_down(3). И теперь функция up_and_down(1) ждет, выполнение up_and_down(2), а она ожидает up_and_down(3).
На данный момент мы имеем в консоли 3 строчки уровень вверх 1 и до 3-х.
Т.к. 3 не меньше 3, мы на этот раз не вызываем рекурсивно еще одну функцию, а печатаем уровень вниз 3 в консоль. И на этом функция up_and_down(3) закончила свою работу и мы обратно переходим в up_and_down(2).
В ней мы печатаем уровень вниз 2 и функция завершает свою работу и теперь опять переходим в up_and_down(1) и печатаем в консоль уровень вниз 1. И выходим!
Попробуйте просто пройтись дебаггером по своему примеру.
Небольшой рисунок):
