python学习-之汉诺塔实现

先上代码:

#move1/2方便分析循环时调用方法的逻辑顺序
def
move1(n,a,b,c): print("-----------1号循环-----------") move(n,a,b,c) def move2(n,a,b,c): print("-----------2号循环-----------") move(n,a,b,c) def move(n,a,b,c): if n==1: return print("n=",n,"(","a=",a,"b=",b,"c=",c,")","***",a,"--->",c) else: move1(n-1,a,c,b) print("n=",n,"(","a=",a,"b=",b,"c=",c,")","***",a,"--->",c) move2(n-1,b,a,c) # print(n,"a1:",a,"b1:",b,"c1:",c) move(3,"A","B","C")

 

输出结果:

-----------1号循环-----------
-----------1号循环-----------
n= 1 ( a= A b= B c= C ) *** A ---> C
n= 2 ( a= A b= C c= B ) *** A ---> B
-----------2号循环-----------
n= 1 ( a= C b= A c= B ) *** C ---> B
n= 3 ( a= A b= B c= C ) *** A ---> C
-----------2号循环-----------
-----------1号循环-----------
n= 1 ( a= B b= C c= A ) *** B ---> A
n= 2 ( a= B b= A c= C ) *** B ---> C
-----------2号循环-----------
n= 1 ( a= A b= B c= C ) *** A ---> C


分析要点有三:
1、方法递归时,程序的执行走向
2、方法递归时,参数的传递
3、为什么这样可以实现汉诺塔

下图是n=3时,递归逻辑走向以及参数变化,n值增加时,以此类推。输出顺序即是执行顺序,每【循环x】一次,输出”-----------x号循环-----------“,且方法参数发生变化

 目前不太清晰的是,为什么这样可以实现汉诺塔,是因为这种参数变化正好符合汉诺塔的操作规则还是其他原因。

n为偶数则先给B,奇数则先给C。

posted @ 2019-07-12 16:36  倦刻懒骨  阅读(297)  评论(0编辑  收藏  举报