Discuss / Python / 我的个人体会

我的个人体会

Topic source

MrMrMr石

#1 Created at ... [Delete] [Delete and Lock User]

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

最后我想说的就是,这个算法很简单,我以为自己很快就可以搞定,但是后面弄下来,确实还是有很大的收获,比如更加理解了列表的作用,以及递归的含义。

迷宫里的

#2 Created at ... [Delete] [Delete and Lock User]

你用列表的作用是···

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行的??


  • 1

Reply