【发布时间】:2021-08-07 14:17:19
【问题描述】:
所以,最近我在一个使用递归的竞争性编码网站上解决了阶乘问题。但是在提交它时会拒绝我的解决方案,而在使用简单的 for 循环时它只会接受它。我读过很多地方说递归比循环慢,但我仍然不确定我的代码是因为递归而被拒绝还是真的有问题。不过,我的代码在 IDE 中运行良好。
这是我使用递归的代码。
更新:好吧,我问我的一位朋友可能是什么原因。所以原因是问题中n的范围被赋予了1000。如果我使用递归,那么阶乘必须存储不可能的数据(如果 n==1000),因为 int 不能存储那么多(1000 的阶乘),即为什么不接受递归。 我是 S.O 的新手,如果问题没有得到正确解释,我很抱歉,下次我会尝试更详细地询问,以免被否决。
int factorial(int n)
{
if(n>1)
{
return n*factorial(n-1);
}
else
{
return 1;
}
}
int main() {
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<< factorial(n);
}
return 0;
【问题讨论】:
-
您确定在循环版本中使用了
int吗?我问是因为阶乘会很快溢出 32 位整数。看起来如果n大于 12,你就会溢出,因为 13!6227020800对于 32 位 int 来说太大了。参考:en.wikipedia.org/wiki/Factorial -
我的代码在 IDE 中运行良好。 -- Are you sure?。顺便说一句,你得到的所有反对票的可能原因是因为你没有做一个简单的测试,就像我链接到的那样。
-
如果
n是1000显然这两种方法都不能正常工作。1000!是一个很大的数字。比语言或系统的最大int变量大得多。您需要使用大型 int 库或编写自己的库。最有可能的是 20 是最大的n,它可以在没有大型 int 库的情况下工作。
标签: c++