题目:如果汉诺塔有4根柱子,要将堆放在第一 根柱子上从小到大排列的n个盘子移动到最后一根柱子上,试实现相应的递归算法。
汉诺塔问题是一个经典的递归问题,如果有4根柱子,要将堆放在第一根柱子上从小到大排列的n个盘子移动到最后一根柱子上,可以按照以下步骤进行递归算法实现:
1. 将n个盘子分成两部分,前n-1个盘子和最后一个盘子。
2. 将前n-1个盘子从第一根柱子移动到第二根柱子上,可以借助第四根柱子。
3. 将最后一个盘子从第一根柱子移动到第四根柱子上。
4. 将前n-1个盘子从第二根柱子移动到第四根柱子上,可以借助第三根柱子。
5. 重复以上步骤,直到所有盘子都移动到最后一根柱子上。
写法一:
def hanoi(n, a, b, c, d):
if n == 1:
print("Move disk 1 from", a, "to", b)
return
if n == 2:
print("Move disk 1 from", a, "to", c)
print("Move disk 2 from", a, "to", b)
print("Move disk 1 from", c, "to", b)
return
hanoi(n-2, a, d, b, c)
print("Move disk", n-1, "from", a, "to", d)
print("Move disk", n, "from", a, "to", b)
print("Move disk", n-1, "from", d, "to", b)
hanoi(n-2, c, b, a, d)
hanoi(4, 'A', 'B', 'C', 'D')
写法二:
def hanoi(n, a, b, c, d):
if n == 1:
print("Move disk 1 from", a, "to", b)
print("Move disk 1 from", b, "to", c)
print("Move disk 1 from", c, "to", d)
return
hanoi(n-1, a, b, d, c)
print("Move disk", n, "from", a, "to", b)
hanoi(n-1, d, c, b, a)
print("Move disk", n, "from", b, "to", c)
hanoi(n-1, a, b, d, c)
n = 4
a = "A"
b = "B"
c = "C"
d = "D"
hanoi(n, a, b, c, d)
写法三:
def move(n, a, b, c, d):
if n == 1:
print(a, '-->', d)
elif n == 2:
print(a, '-->', b)
print(a, '-->', d)
print(b, '-->', d)
else:
move(n-2, a, c, d, b)
print(a, '-->', c)
print(a, '-->', d)
print(c, '-->', d)
move(n-2, b, a, c, d)
move(4, 'A', 'B', 'C', 'D')