2017-01-24 14 views
2

私はJavaを使い慣れていません。理解できない小さなプログラムを見つけたときに再帰に関する記事をいくつか調べていました。再帰呼び出しの結果

static void print(int i) { 

    if (i > 1) { 
     System.out.print("Y"); 
     print(i-1); 
    } 

    for (int t = 0; t < i ; t++) 
     System.out.print(i); // i not t 
    } 

私はprint(4)成果を行うYYY1223334444ですが、なぜそれがYYY1ではないでしょうか?私はその部分を取得しません。

+2

デバッガでステップしてみましたか? (ヒント: 'if'ブロックが完了した後、何が起こると思いますか?) –

+1

Oeh thats良いこと、すぐに試してみます。 –

答えて

8

答えの一部である、デバッガ、と自分でおなじみ作ります最善のアプローチ:コードをロールアウトし、メソッドが実際に呼び出される順序を確認します。知っておくべき重要なことは、再帰的なprint(i-1)コールがのブロックであることです。呼び出されるまで待ってから、次のステートメント(forループ)に進みます。これは、i引数が1である呼び出しに到達するまでに、4つの呼び出しが深いことを意味します:print(4) - > print(3) - > print(2) - > print(1)。これはなぜ人々が "コールスタック"を話し、例外を出力した場合にスタックトレースを取得するのかです。ああ、なぜ、コールスタックが非常に深く(例えば、終了条件なしの再帰)、特定の値を超えている場合、この非常サイトが呼び出された後のstackoverflowエラーが発生します。

ジェラルドは答えをタイプしていましたが、私はあなたにうってつけの助けとなるような視覚的な表現をしていました。色付きのブロックはメソッドの呼び出しで、呼び出しスタック内でどのように並んでいるかを示す入れ子と、プログラムの文フローの矢印が表示されます。 recursive program flow & call stack

+0

これ以上の適切な答えを求めることができませんでした!ありがとうございました。 –

+0

この空想図を作成するために何を使用しましたか? – Gala

+0

@Gala私はdraw.ioを使用しました。これはブラウザでそのまま使用でき、無料です。それはjGraphによるものです。ダイアグラム作成ソフトウェアが進歩する限り、これは何かを作るための私の努力に最も抵抗しているようです:D –

5

if、recursion、loopを展開しましょう。システムが行うこと:

print(i=4) { 
    System.out.print("Y")   -> Y 
    print(i=3) { 
    System.out.print("Y")  -> YY 
    print(i=2){ 
     System.out.print("Y")  -> YYY 
     print(i=1){ 
     //skip if and print 1x i=1 
     System.out.print(1)  -> YYY1 
     } 
     //print 2x i=2 
     System.out.print(2)  -> YYY12 
     System.out.print(2)  -> YYY122 
    } 
    //print 3x i=3 
    System.out.print(3)  -> YYY1223 
    System.out.print(3)  -> YYY12233 
    System.out.print(3)  -> YYY122333 
    } 
    //print 4x i=4 
    System.out.print(4)  -> YYY1223334 
    System.out.print(4)  -> YYY12233344 
    System.out.print(4)  -> YYY122333444 
    System.out.print(4)  -> YYY1223334444 
} 

コードdeosはifの後には戻りませんが、forループは実行します。

は、Javaに新しいしている場合は、ステップ・バイ・ステップ実行や値イントロスペクションを可能にし、ジェラルドMückeが提供するすべてのJava IDE

+0

ありがとうございます。 'if'の後にコードは' for'loopを実行しますが、その瞬間には 'i'ではありません。どうすれば2になりますか? –

+0

@ YoussefSakuragi呼び出されたメソッドの呼び出しに戻ります。ここで 'i'は2です。再帰の基本的な概念は、複数の呼び出しが返されるまで積み上げられます。 – pjs

+2

'i-1'は' i'の値を変更せず、新しい値を作成し、次の呼び出しに渡します。しかし、メソッドが戻ってくると、元の 'i'の値が再び有効になります。 –

関連する問題