使用递归的C阶乘程序

时间:2019-06-06 16:19:43

标签: c function recursion factorial

程序将输入一个值,并应计算该数字的阶乘。但是,输入数字后会有延迟,程序会停止

到目前为止,由于我不完全了解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;
}

2 个答案:

答案 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 casen)为止,然后该实例将返回到它之前的实例,并且直到所有实例都返回为止。

为简单起见,让我们逐步了解n == 0。已达到基本情况,即终止进一步递归调用并返回calcFactorial(3)的实例。在到达基本案例之前的实例中,1使该实例将返回n == 1,因为它之前的实例返回了1*1。之前的实例为1,因此该实例返回n == 2。在此之前的实例是第一个实例2*1,因此该实例返回n == 3。现在,所有实例都已返回,结果为6,这就是我们对3*2的期望。

您可以了解有关递归here

的更多信息