c++ - C++ 中的递归与迭代阶乘

标签 c++ recursion iteration factorial

我编写了一个糟糕的 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;
}

最佳答案

iterativ_fak()中,您乘以int类型的变量n。它是32位类型,只能存储12个!最大时另一方面,rekursiv_fak() 返回 unsigned long long 类型变量,因此有 64 位来存储 n * rekursiv_fak(n - 1) 的结果。

关于c++ - C++ 中的递归与迭代阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61574996/

相关文章:

python - 超出最大递归深度,但仅在使用装饰器时

c - 检测lua表爬行中的无限循环

c++ - 是否可以在 C++ 虚拟(纯)类成员中提供异常?

c++ - Detect BIOS from WinPE : Legacy or UEFI, using vbs//Outputting results from a .exe to .txt 文件

linux - python的汇编函数

javascript - 简单的 JavaScript 映射——使用一个对象作为返回值

java - 查找是否存在于枚举中而不进行迭代?

javascript - 关于遍历使用 resig 的简单 js 继承脚本创建的实例的问题

c++ - 我正在尝试使用 OpenCV 对彩色图像进行降噪

c++ - 使用(未)捕获的异常进行堆栈展开