[英]C program for calculating factorial
我编写了一个小函数,用于计算C中数字的阶乘,如下所示:
int factNnumbers(int n)
{
if(n == 1)
return 1;
else
return (n*factNnumbers(--n));
}
我将上面显示的函数称为:
factNnumbers(takeInputN());
其中输入函数( takeInputN
)定义为:
int takeInputN()
{
int n;
printf("\n\nHow many numbers ?? \n ");
scanf("%d", &n);
return n;
}
如果我在我的阶乘代码中更改一行,如下所示,我的程序运行完美。 否则使用上面的代码打印数字输入-1
的阶乘(例如,如果数字输入为5
,则打印阶乘4
)。 为什么会这样?
int factNnumbers(int n)
{
if(n != 1)
return (n * factNnumbers(--n));
}
您正在调用未定义的行为,它在一个版本中工作只是一个意外:
return (n*factNnumbers(--n));
你首先使用n
然后递减它还是相反? 我不知道,编译器也没有,它可以自由地执行其中任何一个或格式化您的硬盘驱动器。 只需使用n * f(n - 1)
。
此外,您的“工作”版本不会返回n==1
情况,这是非法的。
问题是你在同一个表达式中读取和修改n
:
n * factNumbers(--n)
该评价n
参数*
和的--n
子表达式是未测序,这使你的代码未定义行为。
最简单的解决方案(以及IMO,更具表现力),就是说n - 1
你的意思是:
n * factNumbers(n - 1)
问题底部的“改进”代码实际上更加错误。 在那里,你有一个控制路径,它将返回一个未指定的值:一个明确的禁止。
注意:这个答案是在问题仍然具有C ++标记时编写的,并使用C ++术语。 C中的最终效果是相同的,但术语可能不同。
代码中存在两种未定义行为的原因:
首先评估n * factNnumbers(--n)
n
或--n
是否未指定。
看到这个 。 你只需要n * factNnumbers(n - 1)
,为什么减少? 之后你没有使用减少的n
(至少你不想这样)。
你没有在所有控制路径上返回一个值, n == 1
会返回什么? 一个不确定的值会弄乱整个结果。
递减规则:X = Y--首先将I的值传递给X并在X = - I第一次传递后递减并递减递减的值X
对于您的情况,您将作为参数传递的参数值递减到函数factNnumbers。 因此纠正这个错误,我邀请你把(n-1)代替(--n)。
我认为最好使用math.h中的tgamma函数进行涉及阶乘的双精度计算(例如泊松分布等):tgamma(n + 1)将给出阶乘(n)。
因子函数的增长非常快,这也适用于太大而不适合整数类型的值。
当n <= 1(或代码中= = 1)时,阶乘函数必须返回1.此外,您的代码中的--n为false,并且应为n-1,如下所示:
function factorial(n)
{
if (n<=1)
return 1;
else
return n * factorial(n-1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.