Novamente, nossas soluções anteriores funcionam, mas estão longe de serem ótimas. Quando movemos as torres, usamos o algoritmo de 3 varas mesmo quando temos 4 varas. Obviamente, movimentos para a última vara são restritos pois ela contém a outra pilha, mas podemos sempre armazenar o menor disco no topo da outra pilha antes de mover nossa pilha.
Para isto, nós precisamos criar uma nova função
hanoi_fast(height, src, free, full, dst)
que move a pilha
de src
para dst
usando free
,
mas armazenando o menor disco em full
antes.
hanoi_fast(height, src, free, full, dst)
não é
recursiva. Ela move o primeiro disco e então chama a função regular
hanoi()
.
Esta mudança melhora enormemente a eficiência, como você pode ver abaixo. Obviamente, este truque também pode ser usado para o algoritmo intercalado, levando, como esperado, a exatamente a mesma eficiência.
Quantidade de discos | Intercalada | Slow Split | Fast Split |
5 pares | 62 movimentos | 88 movimentos | 46 movimentos |
6 pares | 126 movimentos | 183 movimentos | 82 movimentos |
7 pares | 254 movimentos | 374 movimentos | 150 movimentos |
Como uma conclusão, a maioria das pessoas se satisfaz com uma solução que funcione e rapidamente ignora possibilidades para melhorar a decomposição do problema. Você não deve fazer isto ;)