2013-05-11 24 views
5

Oto mój kod Java dla rozwiązywania Wieża Hanoi za pomocą rekurencji:Wieża Hanoi rekurencji java

/**here is a stack of N disks on the first of three poles (call 
them A, B and C) and your job is to move the disks from pole A to pole B without 
ever putting a larger disk on top of a smaller disk.*/ 

public class Hanoi { 

    public static void main(String[] args) { 
     playHanoi (2,"A","B","C"); 
    } 

    //move n disks from position "from" to "to" via "other" 
    private static void playHanoi(int n, String from , String other, String to) { 
     if (n == 0) 
      return; 
     if (n > 0) 
     playHanoi(n-1, from, to, other); 
     System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
     playHanoi(n-1, other, from, to); 
    } 

} 

Czy miejsce kładę metody sprawę drukowania? Czy mogę to zrobić tak:

playHanoi(n-1, from, to, other); 
    playHanoi(n-1, other, from, to); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
+2

tak to robi ..... "printf" w pierwszym przypadku będzie pomiędzy wywołaniami funkcji, aw drugim, po dwóch wywołaniach funkcji. – Bill

+1

uruchom go i zobacz wyjście, aby zrozumieć różnicę ... – Bill

+0

również, pierwsza metoda jest lepsza (i poprawna), ponieważ nie powinieneś przenosić dysków za pomocą drugiego podejścia .... pomyśl dlaczego :) – Bill

Odpowiedz

11

Rozwiązywanie problemu w ten sposób to nic innego jak zdefiniowanie strategii, w jaki sposób chcesz wykonać zadanie. I kod:

playHanoi(n-1, from, to, other); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 
    playHanoi(n-1, other, from, to); 

Zasadniczo definiuje swoją strategię podoba ryk,

  1. Move n-1 dyski z "z" (źródło Tower) do " inny " (Wieża pośrednicząca).
  2. Następnie przesuń n dysk th z "z" (Wieża źródła) "do" (destination wieży).
  3. końcu przejść n-1 dysków z "inne" (Wieża pośredniczącego) do "do" (docelowy) wieży.

Twój prinf zasadzie robi krok nd .

Teraz, jeśli napisać kod tak:

playHanoi(n-1, from, to, other); 
    playHanoi(n-1, other, from, to); 
    System.out.printf("Move one disk from pole %s to pole %s \n ", from, to); 

Wtedy to w zasadzie robi:

  1. Move n-1 dyski z "z" (źródło wieża) do "inne" (pośrednia wieża).
  2. następnie przenieść n-1 dysków z "inne" (Wieża pośredniczącego) do "do" (docelowy) wieży.
  3. końcu przenieść n dysk th z "z" (Wieża źródła) "do" (destination wieży).

    W niniejszej strategii, po wykonaniu etapu nd (przeniesienie wszystkich n-1 dysków z "inne" do "do") Etap r staje się nieważny (przeniesienie n th dysku z "od" do "do")! Ponieważ w Tower of Hanoy nie możesz umieścić większego dysku na mniejszym!

Więc Wybierając drugą opcję (Strategia) prowadzi do nieprawidłowej strategii, to dlaczego nie można tego zrobić!

1

To naprawdę ma znaczenie. Cokolwiek po wywołaniu rekursji zostanie wykonane po rozwinięciu rekursji (i wszystkim przed nią, wcześniej), więc możesz znaleźć wyjście w bezsensownej kolejności.

Należy pamiętać, że instrukcja po wywołaniu funkcji nie zostanie wykonana, dopóki funkcja nie powróci.

Powiązane problemy