Заменить рекурсию циклом C++
Возникла следующая ситуация. Реализую свою собственную библиотеку длинной арифметики. Возникла необходимость написать функцию подсчета факториала. Немного поискав в сети алгоритмы быстрого подсчета факториала я нашел не сложный и одновременно быстрый алгоритм подсчета "деревом", вот его код:
#include <iostream>
int factorial_tree(int number_thirst, int number_second) {
if (number_thirst > number_second)
return 1;
if (number_thirst == number_second)
return number_thirst;
if (number_second - number_thirst == 1)
return number_thirst * number_second;
int tmp = (number_thirst + number_second) / 2;
return factorial_tree(number_thirst, tmp) * factorial_tree(tmp + 1, number_second);
}
int factorial(int number) {
if (number < 0)
return 0;
if (number == 0)
return 1;
if (number == 1 || number == 2)
return number;
return factorial_tree(2, number);
}
int main() {
int number;
std::cin >> number;
std::cout << factorial(number) << std::endl;
return 0;
}
Я изучил этот алгоритм и встроил его в свою библиотеку. Все работает, все хорошо. Однако, в данном алгоритме используется рекурсия и я предполагаю, что при больших значениях факториала (>1000000) возможно переполнение стека. Единственное нормальное решение, которое я вижу - заменить рекурсию циклом. Я пытался это сделать - не получилось. Короче говоря, нужна помощь с заменой рекурсии на цикл в этом алгоритме.
Ответы (1 шт):
Вопрос закрыт. Как верно сказали в комментариях к вопросу, переполнение стека возникнет только на очень неприличных факториалах, а затраты на рекурсивные вызовы минимальны.