gpt4 book ai didi

c - C 教程中的这个阶乘函数是错误的吗?

转载 作者:行者123 更新时间:2023-12-04 11:03:34 25 4
gpt4 key购买 nike

我有一点 Python 编程经验,出于好奇,我开始学习 C,至少是最基础的。在教程中,我找到了一个用于计算阶乘的示例函数,它是这样的:

int factorial(int x)
{
int i;
for(i=1; i < x; i++)
{
x *= i;
}
return x;
}

我还添加了这些行以查看输出:

#include <stdio.h>

int main()
{
int val;
val = factorial(5);
printf("%d\n",val);
return 0;
}

然后我用gcc factor.c -o factor.out编译了代码,运行……哎呀,结果是-1899959296,显然有问题.

尝试了几次之后,使用 printf() 打印了 ix,我弄清楚出了什么问题(我想): 由于 for 循环的条件检查计数器是否小于 x,并且在每一步 x 变得越来越大,i总是小于x,所以循环一直进行下去,估计是x的值太大时停止(应该与int,我对各种数据类型还不是很熟悉)。

所以,为了“解决”这个问题,我重写了这个函数:

int factorial(int x)
{
int counter = x;
int number = x;
int i;
for (i=1; i < counter; i++)
{
number *= i;
}
return number;
}

我编译了程序,运行,打印出来的值是120,是正确的。

我稍微搜索了一下 C 中的阶乘函数的示例,发现许多解决方案比我的要好得多,考虑到负数和 long 之类的格式,但所有这些都在某种方式,似乎依赖于两个“主要”变量,很像我的解决方案。

那么,最后一个问题:所提出的示例是错误的,还是我遗漏了什么?这真的让我很困扰,因为如果这样一个简单的例子是公然错误的,我应该质疑其他人的可信度。

最佳答案

是的,的确如此。正是由于您已确定的原因,原始阶乘函数是错误的。您不能将 x 同时用作累加器和循环限制。

在您的版本中,我建议的一项改进是去掉 counter。由于您不再修改 x,因此不需要保存它的副本。

int factorial(int x)
{
int number = x;
int i;
for (i=1; i < x; i++)
{
number *= i;
}
return number;
}

如果你反转循环,你可以在没有额外变量的情况下做到这一点。

int factorial(int x)
{
int i;
for (i = x - 1; i > 1; i--)
{
x *= i;
}
return x;
}

不过,我不会这样写。修改输入参数是糟糕的风格。

关于c - C 教程中的这个阶乘函数是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com