引入递归:
递归的两个特点:
1、调用自身
2、结束条件
简单判断哪些递归写法可行:
左边两个函数没有结束条件,无穷递归
右边两个函数可以实现递归 (一个先打印后调用,另一个先调用后打印)
简单流程:
汉诺塔问题引入:
法国数学家提出这么一个问题:大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘;
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上;
在小圆盘上不能放大圆盘,在三根柱子之间只能移动一个圆盘;
64根柱子移动完成之日,我们说的世界将会毁灭。
例如:n=2时
则:n=n时
# 我的理解,简单来说就三步:
汉诺塔问题就是<1>将其分为1和n-1根柱子,n-1根柱子先从第一根柱子经过第三根柱子,再到第二根柱子.<2>将第一根柱子上的最大的那个圆盘,从第一根柱子直接移到第三根柱子上。<3>将n-1个圆盘再从第二根柱子经过第一根柱子到第三根柱子。
代码展示:
'''
汉诺塔问题 运用递归
三根柱子 设为(A-B-C)
规则:
所有盘子从第一个柱子(A),经过第二根柱子(B),到第三根柱子(C)
每次只能移动一个盘子且从上到下,盘子you小到大的顺序排列
'''
def hanoi(n,a,b,c):
'''汉诺塔函数'''
if n>0:
hanoi(n-1,a,c,b)
print("moving from %s to %s" % (a,c))
hanoi(n-1,b,a,c)
hanoi(3,'A','B','C')
运行结果:
推展传说结果:
总结:
采用整体化思想处理汉诺塔问题,因为每次只能对每根柱子上最小的那个圆盘进行平移。
我们可以将汉诺塔看成两部分,1个圆盘和n-1个圆盘 。n-1个圆盘通过第三根柱子最终移到第二根柱子上面,第一根柱子上的最大的那个圆盘顺理成章的移到第三根柱子上,再将n-1个圆盘经过第一根柱子的处理到最后的第三根柱子。
汉诺塔函数参数(盘子个数,从...,经过...,到...)
至于递归的具体过程不必多想。