0

在 C 中使用带有 while 循环的递归的阶乘程序。大家好,感谢您的宝贵回复。

  1. 你们都说使用(如果条件而不是while)。正确的我接受你的建议。那我为什么不使用 while 来使用递归函数查找阶乘。

  2. 有人说while(n>1)是无限循环。但是在这个程序中,函数本身n的值会减少。fact(n-1)现在在这个程序中,我在 while 循环之后放了一个printf()and来知道. and函数仅在while 条件变为 false 时执行。getch()nprintf()getch()

当我运行这个程序时,printf()函数和getch()函数重复执行,printf()函数返回n值 = 1。所以我确定 的值n是递减的。那为什么这个程序会一次又一次地执行while循环呢?

  1. 在所有函数中,return 语句是最后一个函数终止语句。当执行到达 return 语句时,执行从函数终止并返回到被调用函数的下一行。但是在这个程序中,在执行到达 return 语句后,它将重复执行相同的函数。这是为什么?

注意:我使用的是 Turbo C 3.0 来运行这个程序,

#include<stdio.h>    
int fact(int n)
{    
    int x=1;    

    while(n>1)    
    {    
        x=n*fact(n-1);    
    }
    printf("N value after the while loop:%d",n);
    getch();
    return(x);    
}    

void main()    
{    
    int n,fact1;    
    scanf("%d",&n);    
    fact1=fact(n);    
    printf("%d",fact1);    
}
4

3 回答 3

2

你确实有一个无限循环。该行fact(n-1)不会减少 的值n。它使用较小的n.

所以,如果你打电话给fact(2),你就会打电话给n==2。在这个函数中,你有一个无限循环调用fact(1). 在第二次调用中,n==1循环条件为假,并且此调用打印您的行并返回 - 进入第一次调用的无限循环(它n仍然是 2)。

于 2012-02-13T03:39:50.680 回答
1

首先我可以建议你在scanf之前放一个这样的提示吗?当没有文本要求您这样做时,控制台提示您输入数字是很奇怪的。看起来程序已经挂了。

printf("Give the value of n:");

因此,为了修复您的程序,我建议您执行以下示例。您必须了解递归的工作原理。您不能只在 while() 中计算一个数字。你必须返回一些东西,否则它是一个无限循环。

#include<stdio.h>
int fact(int n)
{
    int x=1;

    while(n>1)
    {
        x = n*fact(n-1);
        return x;
    }
    return x;
}

void main()
{
    int n,fact1;
    printf("Please provide the value of \'n\':");
    scanf("%d",&n);
    fact1=fact(n);
    printf("Result is %d",fact1);

    return 0;
}
于 2012-02-13T03:30:59.940 回答
0

在这里,我将为您提供一个非常容易理解的代码。它非常简短且有效。当然,我使用递归对其进行了编码:

您需要包含的唯一标头是 stdio.h。

主要的:

int main() {
unsigned long n;
scanf("%lu", &n);
printf("%lu\n", factorial(n));

}

函数计算阶乘:

 unsigned long factorial(unsigned long n) {
if (n==1) {
    return 1;
} else {
    return n * factorial(n-1);
}

}

如您所见,这是一个非常简短而有效的程序。我使用了无符号长整数,以便程序可以输出并计算非常长的数字,而不会出现溢出或类似的东西。您不需要任何类型的循环,只需要递归函数。

于 2019-01-14T13:38:37.287 回答