分析代码 - 阶乘函数

Analyse Code - factorial function

我正在分析一段代码,我不确定它为什么不起作用(当它编译时我变成了一个 windows 消息,该程序不再起作用并且需要关闭) .

代码:

    #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 替换为 '&x'。也没用。

感谢您的帮助。

运算符input--先传当前值,再减变量, 你得到一个无限循环。

使用input * factorial(input - 1).

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

但这是个坏主意。事实上,运算符(即本例中的“*”)可以按任何顺序计算操作数。 F.e。编译器可以计算第二个操作数,即factorial(--input),然后input的值将被递减。

相乘后你的结果是 newInput * factorial(newInput) 而你想得到 oldInput * factorial(newInput).

最担心的是,结果取决于编译器的版本,或者命令行的参数,所以你不能绝对预测。

表达式

return input *factorial(input--);

post 增加 input。传递给 factorial 的值仍然是 input.

不仅如此,您还处于未定义行为领域,因为表达式中也使用了 input

给定 input = 3,

input *factorial(input--);

很容易成为:

2 *factorial(3);

3 *factorial(3);

你应该使用:

return input *factorial(input-1);