2016-08-04 6 views
-1

再帰を使用して階乗を計算しようとしていますが、プログラムが間違った値を返しています。再帰機能を理解できません。再帰の仕組みを理解するのを手伝ってください。間違った値を返す再帰を使用するファクタリックなプログラム

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    //code 
    int T,N,sol; 
    scanf("%d\n",&T); 

    while(T--) { 
     scanf("%d\n",&N); 

     sol=fact(N); 
     printf("%d\n",sol); 
    } 

    return 0; 
} 

int fact(int n) 
{ 
    int value; 
    while(n>0) { 
     value=n*fact(n-1); 
     n=n-1; 
    } 

    return value; 
} 
+1

機能を正しく設定していないため、 – Li357

+1

を使用する前に 'value'を初期化しています。プラス機能も間違っています。 @AndrewL。 – Haris

+0

あなたは私に関数のエラーがどこにあるのか教えてください。 –

答えて

3

は、このいずれかであなたの実際の機能を置き換えます:あなたは機能fact

に再帰と同様に、whileループを使用している

int fact(int n) 
{ 
    int value = 1; 
    if(n>0) 
    { 
     value=n*fact(n-1); 
    } 
    return value; 
} 
+2

これは正解ですが、理由を説明してください。 – Li357

0

再帰を置き換える必要があり、次のように私のコードですループ。また、関数の終了条件も必要です。階乗については、それは0であり、0の階乗は1である。

関数は負の数の条件を追加する

int fact(int n) 
{ 
    int value; 
    if (n <0) 
    { 
    return -1; 
    } 
    else if (n == 0) 
    { 
    return 1; 
    } 
    else 
    { 
    value=n*fact(n-1); 
    } 
    return value; 
} 

編集以下のように書き換えることができます。関数が-1を返すと、メインプログラムはユーザーにエラーメッセージを与える必要があります。

+0

負の値を渡すと、再帰は決して終了しません。 – Li357

+0

負数の因数は定義されていません。負の数が予想される場合、好ましくは入力段階で何らかの他の種類のエラーを与える必要があります。この関数は-1を返してエラーを示すこともできます。 –

+0

そのためにケースを設定してください – Li357

関連する問題