Pré requisitos: Git e Ruby 2.7 instalados
- git clone git@github.com:andre-dan/Torre-de-Hanoi.git
- cd Torre-De-Hanoi
- ruby tower_hanoi.rb
Torre de Hanoi é um jogo muito famoso. Neste jogo, existem três pinos e N número de discos colocados um sobre o outro em tamanho decrescente. O objetivo deste jogo é mover os discos um a um do primeiro ponto para o último ponto. E existe apenas UMA condição, não podemos colocar um disco maior em cima de um disco menor.
Usaremos uma notação geral: towerHanoi(disks, source=[], aux=[], target=[], moves=0) Onde,
- towerHanoi - denota nossa função
- disks - indica o número de discos
- source - é o pino inicial
- aux - é o pino auxiliar
- target - é o pino final
- moves - contador de etapas
- Recebemos a representação do disks como argumento na chamada do método;
- Criamos 4 argumento default que são representação dos 3 pinos;
- Verificamos dentro de um if se os pinos estão vazios ou seja sem nenhum disco;
- Então fazemos com que o pino source receba,a quantidade de discos informada como argumento.
Para resolver este jogo, seguiremos três etapas simples recursivamente.
- Chamada do método com contador recebendo valor: moves = towerHanoi(disks - 1, source, target, aux, moves)
- Chamada do método com contador recebendo valor: moves = towerHanoi(1, source, aux, target, moves)
- Chamada do método towerHanoi(disks - 1, aux, source, target, moves)
Se houver N discos, podemos resolver o jogo em movimentos mínimos de 2N - 1.
Exemplo: N = 3
Movimentos mínimos necessários = 2 ** 3 - 1 = 7 Sendo assim, adicionei um contador para retornar esse numero de etapas de conclusão da torre, que é o resultado.