2012-04-27 14 views
-1

私の大学からの古い試験用紙を勉強して、来るべき試験を準備することができます。最も簡単な問題から最も複雑な問題まで、すべてが簡単に理解できます。しかし、私の人生では、次のことを理解することはできません。再帰 - Javaでのこの単純な算術を理解できない

class k{ 
    static int g(int n) { 
     if (n==0){ 
      return 1; 
     } else { 
      return 2*g(n-1); 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println(g(3)); 
    } 
} 

なぜこのコードは答えとして8を返しますか?私はそれが基本的には、その数字の入力が2のその数のパワーに計算されているので、この場合の答えは8ですパワー関数を取得します。しかし、実際に何が起こっている。理解できません。誰か簡単な英語で説明できますか?私は本当にそれを感謝します。

ところで、質問は出力が何であるかを尋ねるだけで、理由は問いません。しかし、私はなぜそれが方法であるか分かっていれば、私はもっと快適に感じるでしょう。

PS:例として5を使用して回答しているのは、上記のコードに3の代わりに5を間違えて入れてしまったためです。

+5

これに最も近い方法は「コンピュータを再生する」ことです。鉛筆と紙を使って何が起こるかを正確にトレースします。コールごとに音符をインデントします。簡単な方法でgrok再帰を行うことができます。 –

+0

@ThomasOwens試験紙のプログラムに3の価値があったことをありがとう、私はテストから5を残していたことを忘れていました。私は今それを修正しました。 –

+0

皆様にお返事ありがとうございます。そして、それが5か3であるかどうか混乱していることをお詫びします。 –

答えて

3

これは再帰と呼ばれます。 nが0以外の場合は、nを1減らして2を掛けます。

return 2 * g(5-1) 

return 2 * g(4-1) 

など。、あなたがrecursionに検討すべき

1

。上記の例は2^nです。だからn=4の場合は16となります。

+0

実際には、2^nではなく、2 ^(n + 1)を計算します。例えば、 'g(0)== 1'と' g(1)== 2'のようになります。 –

+0

固定。ありがとう.. –

1

これは、一度に少数の算術演算を取り、いくつかの終了条件が満たされるまで残りの部分を送信する再帰関数です。

たとえば、よく知られている階乗帰納法を取ります。

public long factorial(int n) { 
    return n == 0 ? 1 : n * factorial(n-1) 
} 

factorial(3)に電話する場合は、次の操作を行う必要があります。

factorial(3) => 3 * factorial(3-1) => 3 * 2 * factorial(2-1) => 3 * 2 * 1 * factorial(1-1) 

ここから再帰的な展開を見ることができます。これと同様の手法をコードスニペットに適用すれば、その答えがなぜそのようになるのかが分かります。

2

誰もが再帰的に言っていますが、nの初期値についていくらか混乱があるようです。この例では3です。

g(3) = return 2 * g(2); 

g(2) = return 2 * g(1); 

g(1) = return 2 * g(0); 

g(0) = return 1; 

すなわち2×2×2×1 = 8

+3

今は '3' *ですが、もともとはありませんでした。 –

1

G(1)= 2 * G(0)= 2

G(2)= 2 * G(1)= 4

グラム(3)= 2 * G(2)= 8

グラム(4)= 2 * gは、(3)16

グラム(5)= 2 * gを=(4) = 32

g(32)は32となります。g(3)は8になります。

関連する問題