2
InafalutamenНасколько я понимаю, "волной" назван такой кусок вывода программы:
Код:
Вызван метод Main 1 раз
[или "Вызван метод Main 5 раз", если это не первая волна]
Вызван метод Main 2 раз
...
Вызван метод Main 1001 раз
Освобождение метода № 1001
Освобождение метода № 1000
...
Освобождение метода № 4
["Освобождение метода № 5", если волна последняя]
Всего таких волн будет 4 (хотя задача параметризуется, т.е. вместо 1000 и 4 можно использовать переменные). Видимо, рассуждения ваши таковы: количество волн можно подсчитать, заметив, что, во-первых, код до
if(i<4) Main() вызывает формирование одной волны, при этом сначала
i=1 и в конце
i=3 (второй по тексту рекурсивный вызов не будет выполняться на всех уровнях рекурсивной вложенности -- из-за условия
i<4); а во-вторых, код
void Main(){... if(i<4) Main();} эквивалентен коду
void Main(){do ... while(i<4);} (т.н. концевая рекурсия), который с очевидностью выполняется 4 раза (в результате будет 4 волны).
Поэтому странно, что код до последнего условия оставляет после себя
i=3, как бы предсказывая то, что записано в последнем условии (
i<4).
Как надо здесь рассуждать? Видно, что код до первого (по тексту) рекурсивного вызова включительно формирует первую "полуволну", и понятно, что при этом будет выведено ровно тысяча и одно сообщение "Вызван метод Main ... раз". На максимальной рекурсивной глубине теперь произойдет вывод сообщения "Освобождение метода № ..." и если
i не меньше 4 (видите, второй по тексту рекурсивный вызов на глубоких слоях рекурсии обходится исключительно из-за условия
i<4), то мы попадаем на предыдущий уровень рекурсивной вложенности, опять выводя сообщение "Освобождение метода № ..." и т.д.
Как только достигается
i<4, так сразу же запускается вторая волна. Заметьте, что впервые условие
i<4 выполняется вовсе не на первом уровне рекурсии (то есть не в том "экземпляре", который был вызван при старте программы), а именно на четвертом уровне глубины. Также важно понимать, что вторая волна начинает выполняться с
i=4. Это кажется тривиальным фактом, но дает разгадку! Действительно, раз мы начинаем с
i=4, то хотя для каждого инкремента
i++ есть симметричный ему декремент
i--, но
i не сможет стать при этих декрементах меньше чем 4. А значит условие
i<4, приводящее ко второму (по тексту) рекурсивному вызову уже выполниться не сможет.
Теперь вспомним, что сейчас рассматривалась вторая волна, которая была запущена при первом же срабатывании
i<4 и произошло это на четвертом уровне вложенности. Поэтому, после отработки второй волны мы по-привычке вываливаемся на предыдущий уровень рекурсии, а именно на третий. Там тоже будет, на этот раз уже третья волна. И так будет продолжаться до самого первого уровня. То есть, волны будут пускаться на четвертом, третьем, втором и первом уровнях -- всего 4 волны.