2016-08-22 13 views
2

私は「Think Java:コンピュータ科学者のように思う方法」という本を読んでいます。私は最近、再帰的方法を取り上げました。再帰関数の変更はどのように変更され、結果を変更しますか?

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

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

if (n == 0) { 
    System.out.println("Blastoff!"); 
} else { 
    countup(n - 1); 
    System.out.println(n); 
} 

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

+0

になりました。スタック交換ネットワークへようこそ。あなたが投稿したサイト(セキュリティ)は、攻撃者からデータやネットワークを保護することです。私はそれがより良い答えを得るスタックオーバーフローに移動するために投票しました。 –

+0

私も同様に投票しました。 user122144、なぜここに質問を投稿しましたか? – unforgettableid

答えて

0

印刷する前にcountup(n - 1)を呼び出すと、再帰が停止するまでに到達できないため、に到達できません。再帰中に、数値はスタックにプッシュされます。再帰が完了すると、すべての数値がスタックからポップアウトされます。

私たちが知っているスタックはです.LIFO(Last In First Out)です。それは3,2,1順にスタックに押し込まれるからです。そのため、スタックから数値がポップアウトされると、1,2,3の順序になります。

しかし、最初のアプローチでは、再帰呼び出しの前に印刷が行われます。だからあなたは3,2,1を順番に取得しています。あなたはそれが通話を終了し、カーソルは次のSystem.outに行くまでSystem.out.println(n)前に、方法はcountdown(n-1)から呼び出し続ける置くと

1
if (n == 0) { 
    System.out.println("Blastoff!"); 
} else { 
    countup(n - 1); 
    System.out.println(n); 
} 

ザッツあなたはsystem.out.println(n);

countdown(n-1)を置いているという理由だけで。 println。再帰がその自己完結型の方法と同様に、どのように動作するか

だから、それはだ、別のメソッドを呼び出す 1の方法は......最終的には、最後の1に戻ってくる、終了します 最後の方法をoncesその後、2-最後と最後-nは、あなたの場合は

、まずそれがcountdown(n-1)になり、それがreachsまでと同じ方法で、n==0をcaling保ちます。 n==0になると、すべてのメソッド呼び出しがSystem.out.println(n);

関連する問題