2012-02-12 16 views
1

私はまだそれが実際にここでどのように働くか、古代の問題ハノイ再帰の塔を理解するのに問題があります。私は理論的にそれを読んだが、私はまだ再帰がここでどのように呼び出されているかは分からない。私が与える理由再帰についての説明が必要ですか?

public static void main(String[] args) { 
// TODO Auto-generated method stub 
    Scanner s = new Scanner(System.in); 
    System.out.println("Input the number of rings"); 
    int rings = s.nextInt(); 
    move(rings, 'A', 'B', 'C'); 
} 

public static void move(int rings, char x, char y, char z){ 
    if(rings > 0){ 
     move(rings - 1, x, z, y); 
     System.out.println("Move ring " + rings + " from peg " + x + " to " + y + "."); 
     move(rings - 1, z, y, x); 
    } 
} 

:誰がリングiの値が再帰が、それは自分自身を呼び出すことを知っている一般的には2

であれば元のために起こっているが、ここで私は立ち往生何各ステップを説明することができますリング値1の場合は、次の行に直接移動します。

System.out.println("Move ring " + rings + " from peg " + x + " to " + y + "."); 

ありがとうございます。

-move方法は-the条件が満たされたリング= 1
と呼ばれている(1> 0が真であるため)ので、移動と呼ばれる。

+4

あなたがここで何を求めているのかよく分かりません。 move(0、 'A'、 'C​​'、 'B')は何もしません(if条件に失敗します)。その後、出力行を呼び出します。あなたの質問を明確にすることはできますか? –

答えて

2

リングの値は1であり、何が起こるかは、以下でありますリングと移動方法の= 0
-anotherインスタンスが起動しますが、このときリング=環 - (> 0が偽であるため)= 0 1
は-the条件が満たされていないので、何も起こらず、その方法は
を終了しますメソッドの最初のインスタンスに戻ります。
- その後、move = ring-1 = 0
- 他のインスタンスが開始され、再び条件が満たされません(0> 0) "if"ブロックに入らずにメソッドを終了させます。

リングが2の場合でも同様のことが起こりますが、より複雑で再帰的なツリーが発生します。リングする移動方法は、2自体がリングそれぞれが2つの移動メソッドを呼び出すであろう、環が1に等しい2つの移動メソッドを呼び出すある環= 2のステップによって0

 2 
    /\ 
    1  1 
/\ /\ 
0 0 0 0 

ステップ、これは希望であります起こる:
-move(1、x、z、y);
-move(0、x、z、y);
-System.out.println( "リング1をペグAからCに移動");
-move(0、z、y、x);
-System.out.println(「リング2をペグAからBに移動」);
-move(1、z、y、x);
-move(0、x、z、y);
-System.out.println(「リング1をペグCからBに移動」);
-move(0、z、y、x);

各コールの呼び出し音の値によって、どこで発生しているのかがわかります。たとえば、
move(1、x、z、y);呼び出しがmove(rings-1、x、z、y)なので、rings = 2のメソッドで発生します。

こちらがお役に立てば幸いです。

+0

5行目で、リングの値は2になっていますか?私は言う: syso(ペグAからBにリング2を移動) – Samuel

+0

誰かがこのケースの再帰がどのように機能しているかを知ることができるより良いexplonationで同じコードを書くことができますか? – Samuel

+0

5行目では、そのパラメータが2であるメソッドのインスタンスで発生するため、呼び出しは2です。再帰呼び出しが行われるたびに、メソッドの新しいインスタンスが「表示され」実行されます。呼び出しが行われたメソッドはそこに残りますが、新しいものが終了するまでブロックされます。実行されるすべてのインスタンスの描画を作成し、次に書き込んだシーケンスの各行をインスタンスの1つとリンクさせてみてください。 – broncoAbierto

関連する問題