【问题标题】:recursive vs iterative factorial in C++C ++中的递归与迭代阶乘
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 但是n * rekursive_fak (n - 1) 不是注册为下一次递归的输入n 吗?如果是这样,编译器不应该将其报告为缩小转换吗?我没有得到任何这样的警告,递归算法返回正确的值直到 factorial (20) 是唯一的方法,使函数和输入参数都成为 unsigned long long int?当我这样写时,sorta看起来很脆弱:/
  • 没有缩小转换,因为您不会在下一次迭代中将n * rekursive_fak (n - 1) 作为参数传递给rekursive_fak()。它接收的参数是 n-1,在您的 factorial(20) 示例中取值为 19,18,17,...,2@
  • @AaronVracar:在n *= i; 中,您只能使用int。使用n * rekursive_fak (n - 1),您拥有int * unsigned long long,因此int 被提升为unsigned long long
  • @AlexM4 哦,是的,愚蠢的我,非常感谢您的澄清!
  • @Jarod42 我已经修改了代码以适应迭代函数中的 unsigned long long int,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2015-04-20
  • 2016-01-28
相关资源
最近更新 更多