Torres de Hanoi. Implemente a função hanoi(num), onde num é a quantidade de blocos do problema da torre de hanoi. A sua função deve dizer qual o movimento realizado e quantos blocos tem em cada torre após cada movimento.

Passo 1

Então, o exercício é sobre as Torres de Hanoi. A ideia aqui é criar uma função chamada hanoi(num) onde num representa a quantidade de blocos que temos. O conteúdo principal envolve recursão, que é quando uma função chama a si mesma para resolver subproblemas menores. Vamos precisar entender como mover os blocos entre três torres seguindo as regras das Torres de Hanoi.

Passo 2

Primeiro, vamos entender as regras básicas das Torres de Hanoi:
  1. Só podemos mover um bloco por vez.
  2. Um bloco maior nunca pode ficar em cima de um bloco menor.
  3. Temos três torres: origem, destino e auxiliar.

Passo 3

A estratégia para resolver o problema com num blocos é:
  • Mover os num - 1 blocos superiores da torre de origem para a torre auxiliar.
  • Mover o bloco maior restante da torre de origem para a torre de destino.
  • Mover os num - 1 blocos da torre auxiliar para a torre de destino.

Passo 4

Vamos implementar isso usando recursão. A função hanoi vai precisar de parâmetros adicionais para rastrear as torres envolvidas em cada movimento. Vamos definir as torres como origem, destino e auxiliar.

Passo 5

Além disso, vamos manter o controle dos blocos em cada torre após cada movimento. Podemos usar dicionários para representar as torres e suas pilhas de blocos.

Passo 6

Agora, vamos escrever o código passo a passo:
def hanoi(num, origem='A', destino='C', auxiliar='B', torres=None, movimentos=[]):
    if torres is None:
        torres = {origem: list(range(num, 0, -1)), destino: [], auxiliar: []}
    
    if num == 1:
        bloco = torres[origem].pop()
        torres[destino].append(bloco)
        movimentos.append(f"Mover bloco {bloco} de {origem} para {destino}")
        print(f"{movimentos[-1]}\nTorres: {torres}")
    else:
        hanoi(num-1, origem, auxiliar, destino, torres, movimentos)
        hanoi(1, origem, destino, auxiliar, torres, movimentos)
        hanoi(num-1, auxiliar, destino, origem, torres, movimentos)
    
    return movimentos, torres

Resposta

Para testar a função com, por exemplo, 2 blocos:

movimentos, torres = hanoi(2)
for movimento in movimentos:
print(movimento)
print(“Estado final das torres:”, torres)

# Explicação Final
Esse código implementa a solução das Torres de Hanoi. Ele move os blocos de forma recursiva, registrando cada movimento e mostrando o estado das torres após cada passo. Ao final, você verá todos os movimentos necessários para resolver o problema e o estado final das torres.

Exercícios relacionados

Implemente a função area_triangulo(matriz). O parâmetro matriz é uma matriz que contém as coordenadas e y dos pontos do triângulo ( e ). Utilize o módulo do produto vetorial para calcular a área do triângulo.
Onde é definido por e é definido por . Isto resultará no seguinte determinante:
Após o cálculo do determinante, obtenha seu módulo (valor necessariamente positivo) e divida por 2 (compare a complexidade com o exercício anterior).
Crie um vetor com 100 elementos aleatórios. Após isso faça a ordenação dos mesmos, SEM UTILIZAR O MÉTODO sort().
Paradoxo do aniversário. Em teoria das probabilidades, o paradoxo do aniversário afirma que dado um grupo de 23 (ou mais) pessoas escolhidas aleatoriamente, a chance de que duas pessoas terão a mesma data de aniversário é de mais de 50%. Implemente um programa que mostra esta teoria. Podem ser utilizados os métodos embutidos nas classes list e set.
Uma certa firma fez uma pesquisa para saber se as pessoas gostaram ou não de um novo produto lançado no mercado. Para isso, forneceu o sexo do entrevistado e sua resposta (sim ou não). Sabendo-se que foram entrevistadas 2.000 pessoas, crie um algoritmo que calcule e escreva:
a) o número de pessoas que responderam sim;
b) o número de pessoas que responderam não;a porcentagem de pessoas do sexo masculino que responderam não.