2011-08-15 11 views
8

Widziałem inne pytania dotyczące SO o funkcji rekurencyjnych i czytałem odpowiedzi, ale nadal nie można uzyskać algorytm kliknąć w głowieWieża Hanoi - JavaScript - The Good Parts

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'); 

W jaki sposób document.write (...), kiedykolwiek uruchomiono. My Logic Po raz pierwszy uruchamiamy dysk funkcji> 3. Następnie rekursywnie wywołujemy funkcję ponownie omijając wszystko poniżej, więc w jaki sposób document.write ma szansę uruchomić?

Rozumiem rekurencję (wykonałem podstawowe przykłady), ale nadal nie mogę zobaczyć, jak uzyskać dane wyjściowe. Jeśli istnieje sposób, w jaki mogę go uruchomić wizualnie i zobaczyć w akcji, to mogłoby pomóc.

Odpowiedz

21

Można pomyśleć, co będzie jak drzewo połączeń (czas porusza się od góry do dołu):

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 miałem napisać to samo, ale twój jest bardziej czytelny. Kluczem, jak sądzę, jest myślenie o każdym 'hanoi()' nie jako 'GOTO', ale raczej jako podprogram poprzedniej' hanoi() '. W tym sensie ma on 'disc' do 0, ale nadal ma trzy' hanoi's otwarte i nadal będą działać. "Annie odejdzie po tym, jak Bob odejdzie, a po Cindy odchodzi, a odchodzi, gdy Doug wychodzi". – brymck