关于汉罗塔函数(24讲)笔记
互谅的广大朋友大家好今天B站上拜读了小甲鱼老师的25讲。
关于递归汉罗塔的函数,看了3遍还是懵逼循环(while Ture: print('懵逼'))
为什么那么难的数学问题可以用这么精简的代码解答(while Ture: print('小甲鱼老师6666666‘))
于是我怀着无比敬佩的心情来研究小甲鱼老师的函数。
def hanoi(n,x,y,z):
if n == 1:
print(x,'-->',z)
else:
hanoi(n-1,x,z,y)
print(x,'-->',z)
hanoi(n-1,y,x,z)
print(hanoi(3,'x','y','z'))
先贴上老师的函数,我决定用3来研究(毕竟太长了会死人的呀~~~QAQ)
x --> z
x --> y
z --> y
x --> z
y --> x
y --> z
x --> z
以上为输出结果,
我得先研究这些数字都是怎么输出来的
于是我再每个输出后面都加了几个方便观察的参数
def hanoi(n,x,y,z):
if n == 1:
print(x,'-->',z,x,y,z,n)
else:
hanoi(n-1,x,z,y)
print(x,'-->',z,x,y,z,n)
hanoi(n-1,y,x,z)
print(hanoi(3,'x','y','z'))
结果为:
x --> z x y z 1
x --> y x z y 2
z --> y z x y 1
x --> z x y z 3
y --> x y z x 1
y --> z y x z 2
x --> z x y z 1
我发现递归函数的输出顺序大概是这样的(前面为n值,中为输出的顺序值,后为输出是x,y,z分别被赋予的值)
3. 3(4)( x y z)
2. 2(6)( y x z) 2(2)( x z y)
1.1(7)(x y z) 1(5)(y z x) 1(3)(z x y ) 1(1)(x y z)
在递归函数里调用hanoi函数的时候,因为调用hanoi的x,y,z位置改变,每次递归形式参数xyz的值都会改变
然后输出的 (x,'-->',z)也会随之改变
在搞清楚了为什么输出这些结果的问题后
我决定研究这个代码的逻辑
还是按照3观察(偷个小懒~~)
通过上面的研究我知道了hanoi(n)的输出顺序中间的哪项就是最底层时候从x移动到z(3(4)x y z)
也就是上图的第一层是解决最下面一个金盘的问题
第二层是解决倒数第二个盘子的问题
依次内推...(也可以看作次级的盘子操作是为了上级盘子的操作做铺垫)
思路可以这么理解:
上面的结果分别可以看出每个金盘的移动顺序和移动轨迹
我们要移动下面的盘子的时候需要上面的盘子到非目的地的杆子上,然后再移动到目的杆上
假设我们移动金盘3的顺序为0
3 3(0)
2 2(1) 2(-1)
1 1(1.5) 1(0.5) 1(-0.5) 1(-1.5)
我们得出的顺序是等于递归输出的顺序的
然后就是移动方向问题
(0)最后一个盘子是移动到Z的(XYZ顺序为x y z)
(-1)然后倒数第二个盘子是先移动到Y,老师用hanoi(n-1,x,z,y)将y和z参数调换。于是print(X,'-->',Z)的值输出就为 X --> Y (XYZ顺序为 x z y)
(1)倒数第二个盘子再从z移动到y,老师用hanoi(n-1,y,x,z)将x和y的值调换,于是print(X,'-->',Z)的值输出就为y --> Z(XYZ顺序为 y x z)
倒数第三个盘子需要根据倒数第二个盘子移动2次分别在中间移动4次。
(-1.5)第一次:倒数第二个盘子要移动到y时 ,倒数第三个盘子需要移动到Z,hanoi(n-1,x,z,y)将y和z参数调换,于是print(X,'-->',Z)的值输出就为 X --> z(XYZ顺序为 x y z)
(-0.5)第二次:倒数第三个盘子需要返回到倒数第二个盘子上面,要从x移动到y。hanoi(n-1,y,x,z)将x和y的值调换,于是print(X,'-->',Z)的值输出九尾 Z --> Y(XYZ顺序为z x y )
(0.5)第三次:倒数第二个盘子从Y移动到z时,倒数第三个盘子需要从Y移动到X。hanoi(n-1,x,z,y)将y和z的实际参数调换,于是print(y,'-->',x)的值输出就为 y --> Z(XYZ顺序为y z x)
(1.5)第四次:倒数第三个盘子需要返回到倒数第二个盘子上面,要从x移动到Z,hanoi(n-1,y,x,z)将x和y的值调换,于是print(X,'-->',Z)的值输出就为y --> Z(XYZ顺序为x y z)
PS:感谢小甲鱼老师给我带来了有趣的PYTHON知识(while Ture: print('小甲鱼6666666666))
我的小学语文是苍老师教的,表达的很模糊,请各位互谅的朋友见谅{:5_91:}
如果有错误还恳请互谅的大佬指正{:5_106:}
页:
[1]