繁体   English   中英

使用递归的C阶乘程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM