相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
分析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到C杆,可以做以下三步:
1.当只有一个盘子的时候 直接 A–C
2.当盘子为2的时候 第一步 盘子1A–B 盘子2A–C 盘子1B–C
3.当盘子为n(n>3)的时候 我们可以把盘子里面第n个和 前面的n-1个(看成一个整体)分别看成步骤2里面的盘子2和盘子1 只要不断循环 直到最后一个盘子 就可以执行第一步了
疫情在家,想学习下python,跟着老师学了一个入门,自己写了一个汉诺塔的程序,请大家指教:
汉诺塔作为一个嵌套函数的经典例题 对于编程思想是有启发意义的 希望你可以掌握
def hannota(n,a,b,c):
#定义一个函数叫hannota,函数有四个,盘子数n,三个柱子ABC
if n==1: #如果只有一个盘子的话 步骤就只有一种
print("第",n,"个盘子从",a,"--->",c) #直接把盘子从A到C
else: #超过1的盘子怎么办?
hannota(n-1,a,c,b) #如果是2个盘子的话 第一步是a到b, 第二个盘子a到c
print("第",n,"个盘子从",a,"--->",c)
hannota(n-1,b,a,c)
n=int(input("输入盘子数:"'\n'))
print(n,"个盘子最少步数操作如下:"'\n')
hannota(n,"A","B","C")
1个盘子的时候检验下
"D:\python project\venv\Scripts\python.exe" "D:/python project/MyWork/MyHannuota.py"
输入盘子数:
1
1 个盘子最少步数操作如下:
第 1 个盘子从 A ---> C
Process finished with exit code 0
没有问题 来继续增加
"D:\python project\venv\Scripts\python.exe" "D:/python project/MyWork/MyHannuota.py"
输入盘子数:
2
2 个盘子最少步数操作如下:
第 1 个盘子从 A ---> B
第 2 个盘子从 A ---> C
第 1 个盘子从 B ---> C
Process finished with exit code 0
第二个也没有问题
大于2的呢?
"D:\python project\venv\Scripts\python.exe" "D:/python project/MyWork/MyHannuota.py"
输入盘子数:
9
9 个盘子最少步数操作如下:
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 3 个盘子从 A ---> C
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 4 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 3 个盘子从 C ---> B
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 5 个盘子从 A ---> C
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 3 个盘子从 B ---> A
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 4 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 3 个盘子从 A ---> C
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 6 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 3 个盘子从 C ---> B
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 4 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 3 个盘子从 B ---> A
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 5 个盘子从 C ---> B
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 3 个盘子从 A ---> C
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 4 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 3 个盘子从 C ---> B
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 7 个盘子从 A ---> C
第 1 个盘子从 B ---> A
第 2 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 3 个盘子从 B ---> A
第 1 个盘子从 C ---> B
第 2 个盘子从 C ---> A
第 1 个盘子从 B ---> A
第 4 个盘子从 B ---> C
第 1 个盘子从 A ---> C
第 2 个盘子从 A ---> B
第 1 个盘子从 C ---> B
第 3 个盘子从 A ---> C
第 1 个盘子从 B ---&