分析代码 - 阶乘函数
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);
我正在分析一段代码,我不确定它为什么不起作用(当它编译时我变成了一个 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);