我在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()
打印i
和x
,我发现了什么问题(我认为):因为{{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;变量,就像我的解决方案一样。
所以,最后一个问题:提出错误的例子,还是我错过了什么?这真让我烦恼,因为如果这个简单的例子明显错误,我应该质疑其余的可信度。
答案 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);
}