0

while ループを使用した C での再帰を使用した階乗プログラム。こんにちは、貴重な回答をありがとうございます。

  1. あなたはすべて(whileの代わりにif条件)を使用すると言いました。その正しい私はあなたの提案を受け入れます。それでは、再帰関数を使用して階乗を見つけるために 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)。この 2 番目の呼び出しでn==1は、ループ条件は false であり、この呼び出しは行と戻り値を出力し、最初の呼び出し (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);
}

}

ご覧のとおり、これは非常に短く効果的なプログラムです。私は unsigned long を使用しました。これにより、プログラムは、オーバーフローなどを発生させることなく、非常に長い数値を出力および計算できるようになりました。再帰関数だけで、どんな種類のループも必要ありません。

于 2019-01-14T13:38:37.287 に答える