c++ - 当我们将递归函数作为参数传递给函数本身时,在 C++ 中会发生什么?
问题描述
在下面的代码中,如果我使用 just factorial(n)
,它会给出正确的输出(120),但是当我使用 时factorial(factorial(n))
,结果是 0。有人可以解释一下出了什么问题吗?
int factorial(int);
int main()
{
int n = 5; // number of terms
cout<<endl<<"The factorial is:"<<factorial(factorial(n));
return 0;
}
int factorial(int x)
{
if(x==1)
return 1;
else
return x * factorial(x-1);
}
解决方案
您的问题是您遇到了integer overflow。
正如您所指出的,5 的阶乘是 120。
所以factorial(factorial(5))
是一样的factorial(120)
。如您所见,您没有将factorial
函数作为参数传递给 external factorial
。您将调用结果传递给内部阶乘作为外部阶乘的参数。代码等价于:
int result = factorial(5); // result = 120
factorial(result); // factorial (120)
问题是120的阶乘是一个非常大的数字,几乎有200位数字。
现在这比int
罐头存储的要大得多。甚至一个long long unsigned int
. 您需要专门的库来处理任意大的数字。
推荐阅读
- javascript - 如何在不检索密钥的情况下检索 Firebase 子数据?
- javascript - 过滤和映射更新的数组并在表格中呈现
- javascript - matchMedia 不完全参考设备方向来模拟 CSS 媒体查询
- php - 网站不显示使用 PHP 存储在数据库中的图像
- c# - Xamarin iOS 高存储使用和奇怪的文件
- typescript - 问题将 ResizeSensor 导入打字稿
- python - !!ValueError:检查输入时出错:预期 lstm_2_input 具有 3 个维度,但得到的数组具有形状 (4982, 12)
- spring - 返回插入记录的处理程序
- angular - 有没有办法通过 @angular/animations 通过 Ionic 特定的 css 属性进行动画处理?
- c# - Html 未显示在控制器中创建的视图中