Представьте, что вы - компьютер, и кто-то вручает вам бумагу с
factorial(3)
написано на нем. Затем вы выполняете процедуру, глядя на аргумент. Поскольку это> 1, вы пишете
factorial(2)
на другом листе бумаги и "вручите его себе", ожидая, пока вы не получите ответ на него, прежде чем продолжить.
Снова вы выполняете процедуру. Поскольку 2 все еще> 1, вы пишете
factorial(1)
на еще одном листе бумаги и передайте его себе, ожидая, пока вы не получите ответ на этот вопрос, прежде чем продолжить.
Опять вы выполняете процедуру. На этот раз вход равен 1, поэтому вы берете первую ветвь и возвращаете 1. Вызов, который обрабатывал factorial (2), теперь имеет ответ, поэтому он умножает 2 на этот ответ (1) и возвращает. Теперь вызов, который обрабатывал factorial (3), получает свой ответ (2) и умножает его на 3, получая 6. Затем он возвращает этот ответ человеку, который начал всю операцию.
Если вы представляете, что держите листы бумаги в стопке перед собой, когда работаете, это визуализация «стопки» в памяти компьютера. Каждый рекурсивный вызов хранит параметр (и любые временные переменные) на своем собственном листе бумаги (в рамке стопки), буквально расположенном в виде стопки, как листы бумаги, одна поверх другой.