程序将输入一个值,并应计算该数字的阶乘。但是,输入数字后会有延迟,程序会停止
到目前为止,由于我不完全了解C中的递归和sunbroutine,因此与我最初的尝试相比,我并没有对代码进行太多更改。
int calcFactorial(int n);
int input = 0, answer = 0;
int main()
{
int n = 0;
printf("Enter number:\n");
scanf("%d", &input);
answer = calcFactorial(input);
printf("The factorial of %d is %d.\n", input, answer);
system("pause");
return 0;
}
int calcFactorial(int n){
int factorial = 0;
if (n==0){
factorial = 1;
}
else{
factorial = n * calcFactorial(n-1);
printf(factorial);
}
return factorial;
}
答案 0 :(得分:3)
函数calcFactorial
printf(factorial);
具有未定义的行为,因为在提供类型为printf
的对象时,函数const char *
的第一个参数被声明为int
。
从函数中删除语句。
或者,如果您想获取中间值,请写
printf( "%d\n", factorial);
还应考虑到对于类型为int
的类型,该类型通常具有4个字节的大小,您可以获得有效阶乘值的最大数量等于12
。
您可以使用类型unsigned long long int
代替类型int
。在这种情况下,您可以计算等于20的数字的阶乘。
这是一个演示程序
#include <stdio.h>
unsigned long long int calcFactorial( unsigned long long int n )
{
return n == 0 ? 1 : n * calcFactorial( n - 1 );
}
int main( void )
{
unsigned long long int input = 0, answer = 0;
printf( "Enter number: " );
scanf( "%llu", &input);
answer = calcFactorial( input );
printf( "The factorial of %llu is %llu.\n", input, answer );
}
其输出可能看起来像
Enter number: 20
The factorial of 20 is 2432902008176640000.
函数中的return语句也可以通过以下方式重写
unsigned long long int calcFactorial( unsigned long long int n )
{
return n < 2 ? 1 : n * calcFactorial( n - 1 );
}
答案 1 :(得分:0)
但是,输入数字后会有一个延迟,并且 程序停止
正如其他人已经指出的那样,printf(factorial)
具有未定义的行为。应该将其删除或正确调用它(例如printf("%d\n", factorial)
)。
不确定为什么system("pause")
在那里,因为这似乎不必要。
从您的代码中删除这两项,我很容易运行它,并为最多12个阶乘获得正确答案。同样,正如其他人所指出的,您的函数仅在{{1 }}归因于integer overflow。
除此之外,您的代码可能更适合输入,例如:
12!
您可以精简/* formats better than original */
printf("Enter number: ");
scanf("%d", &input);
printf("\n");
函数,因为不需要calcFactorial
变量或int factorial
子句。所以您可以使它看起来像这样:
else
我不完全理解C语言中的递归和sunbroutines
本质上,您的函数将被int calcFactorial(int n){
if (n == 0) return 1; //base case, 0! is 1
return n * calcFactorial(n - 1); //all other cases
}
一遍又一遍地调用,每次调用时,我们都将其称为实例化,并且在每个实例化中,n
比其实例中的实例少一个。上一个实例。这将一直进行到到达base case(n
)为止,然后该实例将返回到它之前的实例,并且直到所有实例都返回为止。
为简单起见,让我们逐步了解n == 0
。已达到基本情况,即终止进一步递归调用并返回calcFactorial(3)
的实例。在到达基本案例之前的实例中,1
使该实例将返回n == 1
,因为它之前的实例返回了1*1
。之前的实例为1
,因此该实例返回n == 2
。在此之前的实例是第一个实例2*1
,因此该实例返回n == 3
。现在,所有实例都已返回,结果为6,这就是我们对3*2
的期望。
您可以了解有关递归here
的更多信息