分析代码 - 因子函数

时间:2015-01-19 22:34:21

标签: c factorial

我正在分析代码而我不知道为什么它不起作用(当它编译时我变成了一个windows msg,程序不再工作而且需要关闭)

代码:

    #include <stdio.h>
int factorial(int input)
{
  if (input > 0)
  {
    return input *factorial(input--);
  }
return 1;
}

int main()
{
printf("%d",factorial(23));
return 0;
}

所以起初我以为会有溢出,所以我尝试过像2和3这样的数字,仍然无法正常工作。 所以我想如果我添加

可能会有用
int x = 23;

并将23与&#39;&amp; x&#39;交换。在打印功能。也没用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

运算符input--首先传递当前值,然后减少变量,并且 你得到了一个无限循环。

使用input * factorial(input - 1)

您可以使用input * factorial(--input)。在这种情况下,input将首先递减,然后使用,因此您可以打破无限递归。

但这是一个坏主意。事实是运算符(即在这种情况下为'*')可以按任何顺序计算操作数。 F.E.编译器可以计算第二个操作数,即factorial(--input),然后input的值将递减。

在您的结果相乘后,您需要获得newInput * factorial(newInput) {/ 1}}。

最令人担心的是,结果取决于编译器的版本或命令行的参数,因此您无法绝对预测它。

答案 1 :(得分:2)

表达式

return input *factorial(input--);

input的后期增量。传递给factorial的值仍为input

不仅如此,您还处于未定义的行为区域,因为input也用于表达式。

给定input = 3

input *factorial(input--);

很容易:

2 *factorial(3);

3 *factorial(3);

您应该使用:

return input *factorial(input-1);