python 递归 之加特技 汉诺塔
看不懂没关系看第二段一下的,最后再来看代码。
def move(n,a,b,c):#n代表起始柱子A,汉洛塔有多少层(n层),位置参数a,b,c代表三根柱子,目的是把 a柱子的移动到c if n==1: print(a,'->',c)#如果柱子a只剩下1个盘子,那么直接移动到C柱子。 else: move(n-1,a,c,b) # 把a上的 (n-1)块 盘子 移动到b 盘子分成2块 ( 第n块 (最下面的那块) 大的 ,(n-1)看成一块 即小的那块 移动到b ) move(1,a,b,c) #a上的最后一块 第n块 (大的) 移动到c move(n-1,b,a,c) #把b上的(n-1)块 (小的那块) 移动到c
神奇的递归如何理解:
先理解最简单的
2层的
只有2个盘子的汉洛塔:
def move(a,b,c):
print(a,'->',b)#a柱子最小的盘子先放到b 对应代码 move(n-1,a,c,b)
print(a,'->',c)#最大的放到c 对应代码 move(1,a,b,c)
print(b,'->',c)#再把b最小的盘子叠到c上。对应代码 move(n-1,b,a,c)
其实这段代码包含了汉咯塔的基本逻辑
实际上 递归就是不断把问题 化解成最简单的,最低层次的。
这个代码可以理解成,不断把 n个盘子看成2个。最下面的盘子 ()和其余盘子,如 1(代表最大的那个)和(n-1)个盘子,至于n-1个盘子再如何移动,再递归。按照 移动盘子的基本逻辑,再移动
总结 递归三要素:
1.基本逻辑(最基础的逻辑)
2.问题的不断分化
3.返回值(有返回的递归 需要 不断的把返回 拼接 成最终答案 )
所以如何写一个递归:
1.分析这个问题最简单的情况
2.找出基本逻辑
3.找出返回值,( 有返回值情况 )
汉洛塔只需要 每步步骤,
所以无返回值