【发布时间】:2020-08-17 20:41:27
【问题描述】:
我制作了一个糟糕的 c++ 程序来计算输入值的阶乘,其中我编写了两个函数来独立进行实际计算(一个迭代,另一个递归)。对我来说没有任何意义的是,为什么迭代阶乘在 n = 13 左右崩溃,但递归一直到 unsigned long long int 的上边界?
附:我会很感激收到任何关于我的代码质量的建议,并且很乐意修改它,谢谢。
#include <iostream>
using namespace std;
unsigned long long int rekursiv_fak (int); // function prototyping
unsigned long long int iterativ_fak (int);
int main () {
unsigned int n; // factorial is defined only for positive integers !!
cout << "Enter a positive integer value: ";
cin >> n;
cout << "The factorial of " << n << " is equal to: " << iterativ_fak(n) << " or alternatively " << rekursiv_fak(n) << endl;
return 0;
}
unsigned long long int rekursiv_fak (int n) {
if (n == 1)
return 1;
return n * rekursiv_fak(n - 1);
}
unsigned long long int iterativ_fak (int n) {
for (int i{n - 1}; i > 0; --i)
n *= i;
return n;
}
【问题讨论】:
-
良好的观察力和非常简洁的编码。一些额外的检查点。用一个非常大的数字尝试 rekursiv_fak,看看会发生什么。还要考虑如何使 iterativ_fak 处理大量数据。 ;)
-
请注意,实际上,
factorial(0) == 1,而您返回 0; -
@sanojsubran 非常感谢,我认为大输入值会使我可怜的笔记本电脑崩溃,因为递归算法的限制行为:((至于我如何优化它,我不是这样当然嗯
-
@Jarod42 感谢您的提示,我将设置一个附加条件来检查空输入
-
@sanojsubran 我认为使
iterative_fak ()使用更大数字的唯一方法是将参数n设为unsigned long long int但这仍然不适用于非常大的数字..我听说还有另一种使用对数的数学方法...
标签: c++ recursion iteration factorial