Una posible forma de resolver este problema es la de darse cuenta que si queremos mover una torre de N discos de la pila 1 a la pila 3, entonces debemos mover la torre superior de N-1 discos de la pila 1 a la pila 3, luego mover el disco mas grande a la pila 2, luego regresar la torre superior de N-1 discos a la pila 1, luego mover el disco mas grande a la pila 3 y finalmente volver a mover la torre superior de N-1 discos de la pila 1 a la pila 3. Esto nos dice que en realidad lo unico que tenemos que acordarnos es de donde a donde se esta moviendo la torre de N discos: Hanoi(N, Direccion) <- origen a destino Si N > 0 Hanoi(N-1, Direccion contraria) Mover disco de la pila origen a la pila 2 Hanoi(N-1, Direccion) Mover disco de la pila 2 a la pila destino Hanoi(N-1, Direccion contraria) Es claro que esta rutina hace el numero minimo de movimientos y que ese numero se encuentra con la formula M(N) = 3M(N-1) + 2, que junto con la condicion M(1) = 2 tiene la solucion M(N) = 3^N - 1. Yo escribi una funcion en C (la anexo abajo) que se tardo 30.922 seg para resolver N = 20 y que se tardo 1 min 32.282 seg para resolver N = 21 (sin imprimir los movimientos). Como el tiempo de ejecucion es aproximadamente T(N) = C*3^N para una constante C que depende de mi maquina, se puede deducir que C = 8.82 a 8.86 nanosegundos/movimiento. Por lo tanto, uno puede esperar que en una hora se pueda resolver para N = 24 < 24.333. Por supuesto, uno podria escribir una funcion parecida con mas parametros (por ejemplo, nombrando explicitamente las pilas origen y destino, o tal vez tambien la pila auxiliar... lo ultimo inutil, pues siempre sera la 2). int hanoi(int n, int dir) /* llamese como hanoi(n, 2) */ { if (n > 0) { hanoi(n-1, dir); printf("%d %d\n", 3-dir, 2); hanoi(n-1, 2-dir); printf("%d %d\n", 2, 1+dir); hanoi(n-1, dir); } }