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

时间:2017-04-01 13:43:09

标签: c

我在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编译代码,运行和... ooops,结果是-1899959296,显然有错误。

经过几次尝试,使用printf()打印ix,我发现了什么问题(我认为):因为{{1}的条件}循环检查计数器是否小于for,并且在每一步x越来越大,x总是小于i,所以循环继续,当x的值太大(应与x相关时,可能会停止,我对各种数据类型还不是很熟悉)。

所以,要解决&#34;解决&#34;问题,我重写了这样的功能:

int

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

我在C中搜索了一些阶乘函数的例子,发现许多解决方案比我的好得多,考虑到负数和格式,如int factorial(int x) { int counter = x; int number = x; int i; for (i=1; i < counter; i++) { number *= i; } return number; } 和诸如此类的东西,但所有这些都是以某种方式或者另一个,似乎依赖于两个&#34; main&#34;变量,就像我的解决方案一样。

所以,最后一个问题:提出错误的例子,还是我错过了什么?这真让我烦恼,因为如果这个简单的例子明显错误,我应该质疑其余的可信度。

2 个答案:

答案 0 :(得分:8)

是的,的确如此。由于您确定的原因,原始因子功能是错误的。您不能将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;
}
但是,我不会这样写。修改输入参数的风格很差。

答案 1 :(得分:2)

我认为通过设置循环条件i<=x并使用另一个变量来存储阶乘将纠正它。

以下是示例:

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

或者你可以使用递归函数

int factorial(int x) {
    if (x == 1)
        return 1;
    else
        return x * factorial(x - 1);
}