📅  最后修改于: 2020-10-29 01:07:24             🧑  作者: Mango
在本教程中,我们将使用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来临时存放磁盘。
# 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次移动。