标签:span 规律 现在 方案 假设 独立 代码 递归 黄金
汉诺塔问题是递归中常见的一类问题,刚开始接触这类问题毫无头绪,但是看了很多资料之后也慢慢发现了其中的一点规律
关于汉诺塔的一点传说:汉诺塔问题是源于印度一个古老的传说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
分析:一共有n块塔片,我们可以把他们想象成独立的两部分,分别是n-1片和1片,假设有三根从左到右编号为x,y,z的三根圆柱,所有的塔片都位于x柱上,n-1片在上,1片在下,现在我们需要通过y柱,z柱将塔片全部移动到z柱上。那么n片的方案就简化成了移动两片的问题了。
注意:虽然是假设把n片塔片分成两片,但是在n-1等于1之前,都需要通过第三根圆柱来协助n-1片从初始柱移动到目的柱
(1)移动n-1片,从x--->利用z--->y
(2) 移动1片,从x--->z
(3)移动n-1片,从y--->利用x--->z
实现代码:
#在这里我们还可以设置一个用来计数的全局变量a,以便于统计一共需要移动的次数,注意a放置的位置,每有一条输出语句出现就需要把a加一
a = 0 def hanoi(n,x,y,z): global a # a += 1 if n==1: print(x,‘--->‘,z) a += 1 else: hanoi(n-1,x,z,y) print(x,‘--->‘,z) a += 1 hanoi(n-1,y,x,z) hanoi(3,‘x‘,‘y‘,‘z‘) print(a)
x ---> z
x ---> y
z ---> y
x ---> z
y ---> x
y ---> z
x ---> z
7
标签:span 规律 现在 方案 假设 独立 代码 递归 黄金
原文地址:https://www.cnblogs.com/chenprice/p/10111568.html