2016-08-23 5 views
2

私は「Think Java:コンピュータ科学者のように考える方法」という本を読んでいます。最近は再帰的メソッドについても取り上げました。再帰的なJavaメソッドを復習する

public static void countdown(int n) 
{ 
    if (n == 0) { 
     System.out.println("Blastoff!"); 
    } else { 
     System.out.println(n); 
     countdown(n - 1); 
    } 
} 

これが0にカウントダウンするために使用される通常の再帰的な方法だろうと私は何が起こっているかを理解していますが、この

public static void countdown(int n) 
{ 
    if (n == 0) { 
     System.out.println("Blastoff!"); 
    } else { 
     countdown(n - 1); 
     System.out.println(n); 
    } 
} 

ようにするSystem.out.println前に、再帰呼び出しを行う場合それは反対の方法を数えるので、もし私がこれらの条件文の両方に対して3つの引数を与えたら、第1のものは "3,2,1、Blastoff"になります。しかし、2番目の1は "Blastoff、1,2,3"になります。これがどのように機能するのか分かりません。このコードで何が起きているのかを説明しようとする人は、逆に数えることができますか?

+0

は、第一の方法ラインとしてのprintlnを置きます。 – RominaV

答えて

0

「反対の方法」はカウントされません。おそらく予期しない順序で「解読」するだけです。起こることを期待していることを書き留めてみてください。私は誤解を解決するのを助けてくれるでしょう。

+0

1秒私はそれを書き留めて、このWTFを編集させてもらえますか?なぜ私は保存せずに入力してもヒットできないのですか? –

+0

2番目の関数では、再帰呼び出しは 'println'の前に*起こりますので、ベースケース(' n == 0'がtrueの場合)に最初に到達します。それから、前の呼び出しの 'println'に戻り、' 3'を出力して戻ります。 – EntangledLoops

+0

編集:これをクリアしてくれてありがとう、私はカウントダウンを呼び出し、System.out.printlnをスキップする私には、nが0に等しいと、再帰呼び出しがカウントアップを続ける方法があります。 –

0

問題は、関数呼び出しが終了するまでプリントラインが待機することです。したがって、最初の印刷行に到達する前に、関数を3回連続して呼び出します。

0

すべてのステップは、すべてのステップが固有のローカル変数を持つ「スタックフレーム」を取得することが覚えています。

nを1つの繰り返しに変更しても、この繰り返しを呼び出した関数は、それ自身の値であるnを保持します。この時間を印刷するときには、nのままですが、それは元の値(次の反復のものより1つ大きい)になります。

4
それの

考えてこのよう...最初のケースは、必ず次の機能を下る前に印刷し、そうだろう...で

countdown(3) 
    System.out.println(3) 
    countdown(2) 
    System.out.println(2) 
    countdown(1)  
     System.out.println(1) 
     countdown(0) 
     System.out.println("Blastoff") 

結果:中3 2 1 Blastoff

あなたが最初にそれを印刷するので、あなたの実行が印刷を開始するベースケースまではるばる再帰下がるだろう後者の場合、...

countdown(3) 
    countdown(2) 
    countdown(1) 
     countdown(0) 
     System.out.println("Blastoff") 
    System.out.println(1) 
    System.out.println(2) 
System.out.println(1) 

結果:1 2 3 Blastoff

再帰が厳しい!私は助けて欲しいと思っています:)

9

私はあなたのためにそれを視覚化しようとします。

、より良い、それがどのように機能するかを理解する最初の方法

countdown(3)    (first call) 
"3"       (sysout) 
    countdown(3-1)   (second call) 
    "2"      (sysout) 
     countdown(2-1)  (third call) 
     "1"     (sysout) 
      countdown(1-1) (fourth call) 
       "Blastoff!" (n == 0) 

第二の方法

countdown(3)    (first call) 
    countdown(3-1)   (second call) 
     countdown(2-1)  (third call) 
      countdown(1-1) (fourth call) 
       "Blastoff!" (n == 0. going back up call stack) 
      "1"    (sysout) 
     "2"     (sysout) 
    "3"      (sysout) 
関連する問題