def move(n, a, b, c, num=[1]): ##利用列表进行计数,因为列表的元素可以修改并返回到列表 if n == 1: print('第%d次:%s-->%s' % (num[0], a, c)) return move(n -1,a,c,b) num[0] = num[0] + 1 print('第%d次:%s-->%s' % (num[0], a, c)) num[0] = num[0] + 1 move(n-1,b,a,c)
>>> move(3,'A','B','C') 第1次:A-->C 第2次:A-->B 第3次:C-->B 第4次:A-->C 第5次:B-->A 第6次:B-->C 第7次:A-->C 这个题借鉴了上面很多朋友的想法,也稍微总结了一下: **1:**关于题目的递归算法,我是这么理解: 首先,如果只有一个需要移动的盘子,即n==1,那么直接输出a-->c,并且用return返回空值(这一步一定要有),表示函数结束; 其次,如果n!=1,那么就开始递归了,递归分三步: 第一,如果我们是把n个盘子从a搬到c,那么第一步我们就需要把最上面的n-1个盘子搬到b,这相当于使用递归函数move(n-1,a,c,b); 第二,把a柱子上剩下的一个盘子搬到c,所以直接print输出就行; 第三,我们还需要把第一步中的n-1个盘子搬到c柱子上,这个时候就相当于使用递归函数move(n-1,b,a,c). **2:**关于函数的实现,需要注意: 我在函数中计算了运算步骤,但是一定要注意,要使用列表作为参数,因为利用列表进行参数传值时,递归函数可以改变列表元素值并返回给列表。如果你直接使用整数的话,那么将会出现下面这种情况: def move(n, a, b, c, num=1): if n == 1: print('第%d次:%s-->%s' % (num, a, c)) return move(n -1,a,c,b) num = num+ 1 print('第%d次:%s-->%s' % (num, a, c)) num= num + 1 move(n-1,b,a,c) >>> move(3, 'A', 'B', 'C') 第1次:A-->C 第2次:A-->B 第1次:C-->B 第2次:A-->C 第1次:B-->A 第2次:B-->C 第1次:A-->C
最后我想说的就是,这个算法很简单,我以为自己很快就可以搞定,但是后面弄下来,确实还是有很大的收获,比如更加理解了列表的作用,以及递归的含义。
你用列表的作用是···
move(n-1,a,c,b)
还是没能理解这句。能说明得更详细吗?谢谢!
学到这我忙乱了。这个递归程序是怎么跑的? 比如用了move(n-1,a,c,b)和move(n-1,b,c,a).开始n=3,运行了两次应该n=1? 那中间的print语句最多也就打印2次程序就结束了。为什么会打印7行的??
Sign in to make a reply
MrMrMr石
def move(n, a, b, c, num=[1]): ##利用列表进行计数,因为列表的元素可以修改并返回到列表 if n == 1: print('第%d次:%s-->%s' % (num[0], a, c)) return move(n -1,a,c,b) num[0] = num[0] + 1 print('第%d次:%s-->%s' % (num[0], a, c)) num[0] = num[0] + 1 move(n-1,b,a,c)
最后我想说的就是,这个算法很简单,我以为自己很快就可以搞定,但是后面弄下来,确实还是有很大的收获,比如更加理解了列表的作用,以及递归的含义。