venceras torres torre solucion nodos interfaz hanoi grafico grafica fuente con codigo java recursion

torres - Recurso de la torre de Hanoi java



torres de hanoi en javafx (2)

Aquí está mi código de Java para resolver la Torre de Hanoi utilizando recursión:

/**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); } }

¿Importa el lugar donde pongo el método de impresión? Además, ¿puedo hacerlo así?

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


Ciertamente importa Cualquier cosa después de su llamada de recursión se ejecutará después de que se desenrolle la recursión (y cualquier cosa antes, antes), por lo que puede encontrar que su salida está en un orden sin sentido.

Tenga en cuenta que la instrucción después de la llamada a la función no se ejecuta hasta que la función regrese.


Solucionar el problema de la Tower of Hanoy de esta manera no es más que definir la estrategia de cómo hacer el trabajo. Y tu código:

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

Básicamente define su estrategia para gustar abajo,

  1. Mueva n-1 discos de "desde" (torre de origen) a "otro" (torre intermedia).
  2. A continuación, mueva el n ° disco de "desde" (torre de origen) a "a" (torre de destino).
  3. Finalmente mueva n-1 discos de "otro" (torre intermedia) a "a" (torre de destino).

Tu prinf básicamente hace el 2º paso.

Ahora si escribes código como este:

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

Entonces básicamente estás haciendo:

  1. Mueva n-1 discos de "desde" (torre de origen) a "otro" (torre intermedia).
  2. A continuación, mueva n-1 discos de "otra" (torre intermedia) a "a" (torre de destino).
  3. Finalmente mueva n th disco de "from" (torre de origen) a "to" (torre de destino).

    En esta estrategia, después de hacer el 2º paso (mover todos los discos n-1 de "otro" a "a" ), el 3er paso se vuelve inválido (moviéndose en el disco de "de" a "a" )! ¡Porque en Tower of Hanoy no puedes poner un disco más grande en uno más pequeño!

Entonces, elegir la segunda opción (estrategia) te lleva a una estrategia no válida, ¡por eso no puedes hacer eso!