При выполнении хвостовых рекурсивных функций (особенно хвостовых рекурсивных функций) часто полезно иметь вспомогательную функцию в дополнение к другой функции, которая имеет более дружественный интерфейс. Функция дружественного интерфейса на самом деле просто устанавливает аргументы менее дружественной функции.
static unsigned factorial_helper(unsigned input, unsigned acc) {
if (intput == 0) {
return acc;
}
return factorial_helper(input-1, acc * input);
}
unsigned factorial(int input) {
if (input < 0) {
do_something_bad();
}
return factorial_helper(input, 1);
}
Передавая значение аккумулятора, вы избегаете использования указателей или каких-либо вычислений по возвращении из вызываемых функций, что делает функции действительно рекурсивными.