📜  Python中的汉诺塔

📅  最后修改于: 2020-10-29 01:07:24             🧑  作者: Mango

使用Python的河内之塔拼图

在本教程中,我们将使用Python程序实现著名的河内之塔拼图。我们将使用递归函数解决此问题。

如果您不熟悉递归函数概念,请访问我们的Python递归函数教程(https://www.javatpoint.com/python-factorial-number-using-recursion)。

河内塔是什么?

1883年,法国数学家爱德华·卢卡斯(Edouard Lucas)发明了河内数学之塔。灵感来自传说中的传说-在古老的印度教寺庙中,这个难题被呈现给年轻的牧师。难题在于,有三个磁极和64个磁盘,每个磁盘都比另一个磁盘小。要解决此问题,请将所有64个磁盘从三个磁极之一移动到另一个磁极,而不会违反基本约束。

磁盘可以一次移动一个磁盘,它们应该在较大的磁盘顶部放置较小的磁盘。

其他民间传说国家说,当他们解决这个难题时,圣殿会粉碎成尘,世界将终结。但是,这将花费大量时间,因为要解决此问题,需要264-1次移动,即每秒18,446,744,073,709,551,615(根据规则,等于5年,84,942,417,355年)。

游戏规则

“河内之塔”的规则很简单,但解决方案却有些困难。有三个杆。磁盘按降序堆叠;最大的磁盘堆叠在底部,最小的磁盘堆叠在顶部。

任务是将磁盘从一个源棒传输到另一目标棒。

不得违反以下规则

  • 一次只能移动一个磁盘。
  • 一根杆中最上方的圆盘可在移动中受到刺激。
  • 较小的磁盘不能放在最大磁盘的下部。

移动次数可以计算为2n-1。

解:

在本教程的开始,我们已经提到过我们将使用递归函数来找到解决方案。

假设第一个杆上有三个圆盘;根据上述公式,我们总共需要7步。最左的杆称为SOURCE,最右的杆称为TARGET。中间杆称为AUX。

需要AUX来临时存放磁盘。

问题方法

  • 创建一个tower_of_hanoi递归函数并传递两个参数:磁盘数n和杆的名称,例如source,auxtarget
  • 当磁盘数量为1时,我们可以定义基本情况。在这种情况下,只需将一个磁盘从移动到目标,然后返回即可。
  • 现在,剩下的移动从n-1个磁盘辅助使用目标作为辅助
  • 然后,剩余的1个磁盘在上移动到target
  • 使用源作为辅助设备,将辅助设备上的n-1个磁盘移动到目标。

Python程序/源代码

# Creating a recursive function
def tower_of_hanoi(disks, source, auxiliary, target):
    if(disks == 1):
        print('Move disk 1 from rod {} to rod {}.'.format(source, target))
        return
    # function call itself
    tower_of_hanoi(disks - 1, source, target, auxiliary)
    print('Move disk {} from rod {} to rod {}.'.format(disks, source, target))
    tower_of_hanoi(disks - 1, auxiliary, source, target)


disks = int(input('Enter the number of disks: '))
# We are referring source as A, auxiliary as B, and target as C
tower_of_hanoi(disks, 'A', 'B', 'C')  # Calling the function

输出:

Enter the number of disks: 3
Move disk 1 from rod A to rod C.
Move disk 2 from rod A to rod B.
Move disk 1 from rod C to rod B.
Move disk 3 from rod A to rod C.
Move disk 1 from rod B to rod A.
Move disk 2 from rod B to rod C.
Move disk 1 from rod A to rod C.

情况-2:

Enter number of disks: 2
Move disk 1 from rod A to rod B.
Move disk 2 from rod A to rod C.
Move disk 1 from rod B to rod C.

根据公式,移动可以发生2n-1,因此n = 3进行了7次移动,n = 2进行了3次移动。