Это потому, что вы unrolling
рекурсия.
Вы на самом деле не увеличиваете n
, вы просто возвращаетесь к предыдущему вызову функции, где n
было n+1
до того, как вы вызвали factorial(n-1)
...
Когда вы начинаете, вы поднимаетесь на
r = n * factorial (n-1);
, что вызовет другой вызов функции factorial
.
Вы продолжаете делать это (начинайте с начала вашей функции и переходите к вызову factorial
с n
, уменьшенным на 1), пока в конечном итоге не вызовете вызов функции factorial
, где n<=1
.
В этом случае вы возвращаете 1, но вы возвращаетесь к предыдущему вызову факториала, где n
было 2, вы выполняете умножение (n * whatever was returned by factorial
), и вы заканчиваете путь B
этого вызова и возвращаете r
.
Но вы снова возвращаетесь к предыдущему вызову функции, где выполняете часть умножения и заканчиваете путь B
и так далее ...
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
return 1
return r
return r
return r
return r