为什么即使不满足条件,我的 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;
}
这是代码片段,当 运行 和数字 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;
}