2017-03-15 7 views
-1

を再帰ます:私は、再帰的な方法として、再びそれを書くし、ユーザーからの入力を取り、完全なプログラムを書いて、事実(NUM)を知りたい方法は、以下のメソッド宣言を考えると、無限に

public static int fact(int num) { 
    int tmp = 1; 
    for (int i = 1; i <= num; i++) { 
     tmp *= i; 
    } 
    return tmp; 
} 

私はこの1つを書いたが、それは無限に作ることができなかった。

public static int fact(int num) { 
    int t = 1; 
    int i = 0; 
    if(i <= num) { 
     t *= i; 
    } 
    return fact(t); 
} 
+1

あなたはあなただけの '0'に 'i'を設定している場合は' tは* = i'は何を思いますか? – azurefrog

答えて

1

あなたのたとえば、numはデクリメントされません。したがって、同じパラメータ値で同じmethodを呼び出して無限復帰に入ります。

簡易版は、次のようになります。

public static int fact(int num) { 
    if(num <= 1){ 
     return 1; 
    } 
    return num*fact(num-1); 
} 
+0

これは働いた!ありがとうございました – Ghada

0

成功した再帰関数は、ベースケースの方にあなたがそれを実行するたびに進行しなければなりません。

階乗関数では、再帰呼び出しに入る前にパラメータから1を引く必要があります。 (fact(5)が順番にfact(3)の結果を使用しますfact(4)、その結果を使用しますので。なぜ?)

ので、return文では、あなたの現在のパラメータとの結果を用いて計算を行うことになるでしょうあなたの再帰呼び出し - つまり、fact(num - 1)に電話をかけ、それにnumを掛けます。

iが必要ではないことに注意してください。これは、メソッドパラメータが各呼び出しでただ落ちる「カウンタ」の役割を果たすからです。

例:

public static int fact(int num) { 

    // Base case: 0! = 1 
    if(num == 0) return 1; 

    return num * fact(num - 1); 
} 
0

これを試してみてください。それがどのように動作するかの

public static int fact(int num){ 
    //This is the ending condition 
    if(num == 0 || num == 1){ 
     return 1; 
    } 

    //Otherwise return num * fact(num - 1) 
    return num * fact(num-1); 
} 

例:

を使用すると、入力として3を取った場合、あなたが得る:

3 * fact(3 - 1) = 3 * 2 * fact(2 - 1) = 3 * 2 * 1 = 6 
関連する問題