# Egyszerre csak egy korongot mozgathatunk. # Egy nagyobb korong soha nem helyezhető egy kisebb korong tetejére. # Csak a legfelső korong mozgatható az oszlopokról.
A probléma rekurzív szerkezete:
# Az korongot áthelyezzük a segédoszlopra. # Az -edik (legnagyobb) korongot áthelyezzük az induló oszlopból a céloszlopra. # Az korongot áthelyezzük a segédoszlopról a céloszlopra.
A korongok mozgatásának minimális lépésszáma:
def hanoi_tower(n, source, target, auxiliary):
"""
Hanoi tornyai probléma rekurzív megoldása.
Args:
n: A korongok száma.
source: Az induló oszlop neve.
target: A céloszlop neve.
auxiliary: A segédoszlop neve.
"""
if n == 1:
print(f"Mozgasd a(z) {n}. korongot {source} oszlopról {target} oszlopra.")
return
# 1. Az n-1 korongot áthelyezzük a segédoszlopra
hanoi_tower(n-1, source, auxiliary, target)
# 2. Az n-edik korongot áthelyezzük a céloszlopra
print(f"Mozgasd a(z) {n}. korongot {source} oszlopról {target} oszlopra.")
# 3. Az n-1 korongot áthelyezzük a segédoszlopról a céloszlopra
hanoi_tower(n-1, auxiliary, target, source)
# Példa használat
n = 3 # Korongok száma
hanoi_tower(n, "A", "C", "B")
Ha , a kimenet:
Mozgasd a(z) 1. korongot A oszlopról C oszlopra. Mozgasd a(z) 2. korongot A oszlopról B oszlopra. Mozgasd a(z) 1. korongot C oszlopról B oszlopra. Mozgasd a(z) 3. korongot A oszlopról C oszlopra. Mozgasd a(z) 1. korongot B oszlopról A oszlopra. Mozgasd a(z) 2. korongot B oszlopról C oszlopra. Mozgasd a(z) 1. korongot A oszlopról C oszlopra.
def hanoi_tower_iterative(n, source, target, auxiliary):
"""
Hanoi tornyai probléma iteratív megoldása.
Args:
n: A korongok száma.
source: Az induló oszlop neve.
target: A céloszlop neve.
auxiliary: A segédoszlop neve.
"""
moves =
stack =
while stack:
n, source, target, auxiliary = stack.pop()
if n == 1:
moves.append((source, target))
else:
# Hozzáadjuk a lépéseket fordított sorrendben
stack.append((n-1, auxiliary, target, source))
stack.append((1, source, target, auxiliary))
stack.append((n-1, source, auxiliary, target))
for i, move in enumerate(moves, start=1):
print(f"{i}. lépés: Mozgasd a(z) korongot {move} oszlopról {move} oszlopra.")
# Példa használat
n = 3 # Korongok száma
hanoi_tower_iterative(n, "A", "C", "B")
Az iteratív megoldás kimenete ugyanaz lesz, mint a rekurzív megoldásé.
Egyszerű vizualizáció Pythonban a `turtle` könyvtár segítségével:
import turtle
def hanoi_visual(n, source, target, auxiliary, pen):
if n == 1:
pen.goto(target)
pen.write(f"Mozgasd a(z) {n}. korongot {source} -> {target}")
return
hanoi_visual(n-1, source, auxiliary, target, pen)
pen.goto(target)
pen.write(f"Mozgasd a(z) {n}. korongot {source} -> {target}")
hanoi_visual(n-1, auxiliary, target, source, pen)
# Példa használat
pen = turtle.Turtle()
pen.speed(1)
hanoi_visual(3, "A", "C", "B", pen)
turtle.done()
- Rekurzió alapelveinek tanítása. - Veremstruktúrák működésének megértése.
- Tárhelyek optimalizált átszervezése.
- Kombinatorikai és optimalizációs problémák modellezése.
A **Hanoi tornyai** egyszerű probléma, amely kiválóan illusztrálja a rekurzió és az optimalizáció alapelveit. A Pythonban történő implementáció mind rekurzív, mind iteratív módszerekkel könnyen megvalósítható, és alkalmas arra, hogy tanulási célokra és algoritmusfejlesztésre használjuk. A vizualizáció segít a probléma intuitív megértésében.