[英]C factorial program using recursion
程序接受输入,并应计算数字的阶乘。 但是,输入数字后会有延迟,程序会停止
到目前为止,由于我不完全了解C中的递归和sunbroutines,因此与最初的尝试相比,我并没有对代码进行太多更改。
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;
}
函数calcFactorial
中的此语句
printf(factorial);
具有未定义的行为,因为在提供int
类型的对象时,函数printf
的第一个参数声明为const char *
。
从函数中删除该语句。
或者,如果您想获取中间值,请编写
printf( "%d\n", factorial);
还请注意,对于通常具有4个字节大小的int
类型,可以获取其阶乘有效值的最大数量等于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 );
}
但是,输入数字后会有延迟,程序会停止
正如其他人已经指出的那样, printf(factorial)
具有未定义的行为。 应该将其删除或正确调用它(例如printf("%d\\n", factorial)
)。
不确定为什么在那里有system("pause")
,因为这似乎不必要。
从您的代码中删除这两项,我很容易运行它,并为最多12个阶乘得到正确的答案。同样,正如其他人所指出的,您的函数最多只能使用12!
由于整数溢出 。
除此之外,您的代码可能更适合输入,例如:
/* formats better than original */
printf("Enter number: ");
scanf("%d", &input);
printf("\n");
您可以精简calcFactorial
函数,因为不需要int factorial
变量或else
子句。 因此,您可以使它看起来像这样:
int calcFactorial(int n){
if (n == 0) return 1; //base case, 0! is 1
return n * calcFactorial(n - 1); //all other cases
}
我不完全了解C中的递归和sunbroutines
本质上,您的函数将被n
遍历,并且每次调用时,我们都将其称为实例化,并且在每个实例化中, n
均比上一个实例化少一个。 这将一直发生,直到达到基本情况 ( n == 0
),然后该实例将返回到它之前的实例,并且将一直发生,直到所有实例都返回为止。
为了简单起见,让我们看一下calcFactorial(3)
。 到达基本案例的情况是终止进一步递归调用并返回1
的实例。 在到达基本案例之前的实例中, n == 1
因此该实例将返回1*1
因为该实例返回了1
。 之前的实例为n == 2
因此该实例返回2*1
。 在此之前的实例是第一个实例n == 3
,因此该实例返回3*2
。 现在所有实例都已返回,结果是6,这就是我们期望的3!
。
您可以在此处了解有关递归的更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.