2011-08-15 15 views
8

良い部品タワー私は再帰関数についてのSO上の他の質問を見ていると私は回答を読んだが、私はまだ私の頭の中をクリックするアルゴリズムを取得することはできません

var hanoi = function (disc, src, aux, dst) { 

    if (disc > 0) { 
    hanoi(disc - 1, src, dst, aux); 
    document.write('Move disc ' + disc + ' from ' + src + ' to ' + dst); 
    hanoi(disc - 1, aux, src, dst); 
    } 
} 

hanoi(3, 'Src', 'Aux', 'Dst'); 

どのようにdocument.write(...)が今まで実行されていますか?私のロジックは、私たちが関数ディスクを3回実行すると初めてです。次に、再帰的に関数を呼び出して、以下のすべてをスキップします。それでdocument.writeはどのように実行されますか?

私は再帰を理解しています(基本的な例を実行しました)が、まだ出力がどのように得られるかは分かりません。私が視覚的にそれを実行し、実際にそれを見ることができる方法があれば、それは多くを助けるでしょう。あなたは、コールツリーとして何が起こるかを考えることができ

答えて

21

(時間は上から下に移動):

hanoi(3, ...) => 
|-> hanoi(2, ...) => 
| |-> hanoi(1, ...) => 
| | |-> hanoi(0, ...) => 
| | | \-> (does nothing) 
| | |-> document.write(...) 
| | |-> hanoi(0, ...) => 
| | | \-> (does nothing) 
| | <-/ [hanoi(1, ...) finished] 
| |-> document.write(...) 
| |-> hanoi(1, ...) => 
| | |-> hanoi(0, ...) => 
| | | \-> (does nothing) 
| | |-> document.write(...) 
| | |-> hanoi(0, ...) => 
| | | \-> (does nothing) 
| | <-/ [hanoi(1, ...) finished] 
| <-/ [hanoi(2, ...) finished] 
|-> document.write(...) [halfway done!] 
|-> hanoi(2, ...) => 
| \-> [same pattern as the first time, with different data] 
\-> [hanoi(3, ...) finished] 
+0

+1私は同じことを書くことについてだったが、あなたは、より読みやすいです。重要なのは、それぞれの「hanoi()」を「GOTO」ではなく、以前の「hanoi()」のサブルーチンとして考えることです。その意味では、「ディスク」は0になりますが、それでもまだ3つの「ハノイ」が開いており、引き続き実行されます。 「アニーはボブが葉を残した後に残し、シンディは葉を残し、ダグの葉の後には葉を捨てる」などがある。 – brymck