出现了以下情况。实现我自己的长算术库。需要编写一个函数来计算阶乘。在网络上搜索了一些快速计算阶乘的算法后,我找到了一个简单且同时快速的算法来计算“树”,这是它的代码:
#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)的值很大,堆栈溢出是可能的。我看到的唯一明智的解决方案是用循环替换递归。我试着去做——它没有用。简而言之,我需要帮助在这个算法中用循环替换递归。
问题已结束。正如对问题的评论中所说的那样,堆栈溢出只会发生在非常不雅的阶乘上,并且递归调用的成本是最小的。