Вы можете, конечно, рекурсировать любым способом, который вам нравится. Например, чтобы вычислить числа Фибоначчи наивным способом, у вас есть рекурсия, которая обязательно очень быстро разветвляется:
inf fib(int n)
{
//... base case
int a = fib(n - 1);
int b = fib(n - 2);
return a + b;
}
Вы также можете написать return fib(n-2) + fib(n-1);
, но дело в том, что вы не можете устранить рекурсивное ветвление в этом случае.
С другой стороны, то, что вы действительно хотите попытаться достичь, - это tail рекурсия, с помощью которой последнее утверждение является не чем иным, как рекурсивным вызовом. Например, ваше суммирование может быть записано как:
void sum(int n, int & result)
{
if (n = 0) return;
result += n;
sum(n - 1, result);
}
Ключевой особенностью этого особого случая является то, что рекурсия может происходить полностью на месте. Как правило, стек увеличивается как ( B & minus; 1) n , где n - глубина рекурсии, а B - количество параллельных оценок. Это экспоненциально (читай: плохо ), , если только не имеет B = 1, и в этом случае можно попытаться спроектировать функцию как хвостовую рекурсию. *