Если он остается рекурсивным, вам понадобится место в стеке как минимум для стекового фрейма (например, предыдущий указатель стека или эквивалентный регистр для поддержки фреймов стека, адреса возврата и пространства для возврата значение) и передаваемая переменная a-1
. 5
и 1
почти наверняка не пойдут в стек, они, скорее всего, будут жестко закодированы в коде.
Это может показаться не таким уж большим, но, если вы позвоните f(999999999)
, вы убьете свой стек. Рекурсия не подходит для операций типа a-1
.
Однако ваш компилятор может быть достаточно умен, чтобы выполнить хвостовую оптимизацию рекурсии примерно так:
int f(int a) {
if (a <= 0) return 0;
return 5 + f(a-1);
}
Конечно, я предполагаю, что этот код, который вы используете, является просто примером, поскольку я думаю, что он, вероятно, может быть заменен нерекурсивным и даже не итеративным:
int f(int a) { return (a > 0) ? a * 5 : 0; }
: -)