为什么即使不满足条件,我的 FirstFactorial 程序仍会继续循环回到 while 条件

Why does my FirstFactorial program keep looping back to while condition even after the condition is not met

这是代码片段,当 运行 和数字 4 输出 2424242448484848288288288288576576576576 时。不确定为什么退出函数代码后执行会跳回到while循环。任何帮助将不胜感激。先感谢您。

#include <stdio.h>
#include <string.h>

int result = 1;
void FirstFactorial(int);

void FirstFactorial(int num) {
    // code goes here
    while (num > 0) {
        result = result * num;
        num--;
        FirstFactorial(num);
    }
    printf("%d", result);
}

int main(void) {
    int var;
    // keep this function call here
    printf ("Enter your no.\n");
    scanf("%d", &var);
    FirstFactorial(var);
    return 0;
}

函数内

void
FirstFactorial(int num)
{
  // code goes here
  while(num > 0)
    {
      result = result * num;
      num--;
      FirstFactorial(num);
    }
  printf("%d", result);
}

每次迭代调用自身 num 次,所有迭代一起输出全局变量结果。

因此,例如,在函数的第一次调用中,函数在 while 循环中针对值范围 [num, 1].

调用自身

去掉while循环,不使用全局变量。

这是一个演示程序。

#include <stdio.h>

unsigned long long int factorial( unsigned long long int n )
{
    return n < 2 ? 1 : n * factorial( n - 1 );
}

int main(void) 
{
    printf( "%llu! = %llu\n", 4llu, factorial( 4 ) );
    printf( "%llu! = %llu\n", 20llu, factorial( 20 ) );

    return 0;
}

程序输出为

4! = 24
20! = 2432902008176640000

请注意,您可以指定的最大值为 20。

要么用循环实现阶乘,要么递归地实现。

两种方法都可行,但您的代码混淆了。

您的函数混合了迭代和递归方法。您可以通过删除导致计算和打印多个中间结果的无用递归来更正它。将 result 定义为全局变量也是一个错误,特别是因为您没有在循环之前重新初始化它。使用 type long long 将允许计算更大的阶乘。在 printf 转换说明符后添加尾随 \n 也是可取的。

这是更正后的版本:

#include <stdio.h>

void FirstFactorial(int num) {
    long long result = 1;

    while (num > 1) {
        result = result * num;
        num--;
    }
    printf("%lld\n", result);
}

int main(void) {
    int var;
    // keep this function call here
    printf("Enter your number\n");
    if (scanf("%d", &var) == 1)
        FirstFactorial(var);
    return 0;
}