【问题标题】:Why does my FirstFactorial program keep looping back to while condition even after the condition is not met为什么即使在不满足条件后,我的 FirstFactorial 程序仍会继续循环回到 while 条件
【发布时间】:2020-05-11 02:37:18
【问题描述】:

这是代码 sn-p,当使用编号 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;
}

【问题讨论】:

  • 因为它是被调用函数中不同的(本地)num。当递归调用返回时,调用者的 num 仍然只减少一次。而且,随着递归下降,即使函数退出也会打印一个值(没有分隔符)。
  • 注意,int 的最大值很可能是 2,147,483,647。这最多允许 12! 的阶乘。
  • @WeatherVane 当你说不同的数字时,我不明白。你能解释一下吗?
  • @FiddlingBits 是的,我只是在尝试 4!但仍然打印出一些奇怪的东西
  • 我不知道你是否掌握了递归,但是假设每次它调用自己时都会给它一个后缀,比如FirstFactorial_1(int num_1)然后FirstFactorial_2(int num_2)等等。每个都独立于前一个。当每一个结束时,它会将控制权交还给前一个——它不只是停止。并且每一个输出的时候都会打印一条消息,而这些消息都是因为没有换行符而相互碰撞的。

标签: c function recursion while-loop factorial


【解决方案1】:

函数内

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。

【讨论】:

  • 永远不要雇用使用递归计算阶乘的开发人员:-)
【解决方案2】:

要么使用循环实现阶乘,要么递归执行。

这两种方法都是可行的,但是你的代码把它弄混了。

【讨论】:

    【解决方案3】:

    您的函数混合了迭代和递归方法。您可以通过删除导致计算和打印多个中间结果的无用递归来纠正它。将result 定义为全局变量也是一个错误,特别是因为您没有在循环之前重新初始化它。使用类型 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2023-04-02
      • 2017-04-10
      • 2021-03-11
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多