暮之洁 发表于 2018-2-2 18:13:45

零基础入门学习Python中24讲对汉罗塔游戏没懂,求助

问题如下:
1.else后面到底是怎么运行的
2.函数后面x,y,z交换顺序有什么作用
3.调用函数时为什么要加引号

BngThea 发表于 2018-2-2 18:28:55

1参考
http://bbs.fishc.com/thread-79183-1-1.html
2 用来表示每一步的操作
3 因为只需要字符串作为形参

像番茄加两个蛋 发表于 2018-2-2 19:43:47

递归我一脸懵逼{:10_266:}

铁棍阿童木 发表于 2018-2-2 20:12:50

本帖最后由 铁棍阿童木 于 2018-2-2 20:15 编辑

首先你要理解这个游戏怎么玩,借用你的代码来解释:
1、x y z 分别代表三根轴(或者针),x 代表圆盘最初所在的轴,z 表示最后需要到达的轴;y代表过渡用的;
2、n代表有多少个圆盘需要移动;
|-- 如果 n == 1 也就是只有一个圆盘需要移动,那么直接从 x 轴移动到 z 轴就行了 --> printg(x," -->",z)
|-- 否则 递归调用自身 youxi(n-1, x,z,y)这里为了把圆盘转移到 z 上去,先要把 n - 1个 圆盘移动到 y 上面才行
            print(x,"-->",z)    # 上一步递归完成,最后把剩余的最后一个圆盘从 x 移动到 z
            youxi(n-1, y,x,z)#然后再递归调用,把在 y 轴上的 n - 1个圆盘借助 x 轴再移动到 z
            (这时就完成了圆盘在三根轴上面的来回移动,并且完整的从 x 轴 移动到了 z 轴)
所以,x,y,z需要在调用时交换位置


最后,加括号表示函数被调用,Python解释器将执行函数内部的代码;如果不加括号,表示函数对象,是存在内存中的一个对象而已,Python不会执行内部代码。

Tony_C 发表于 2018-2-2 20:48:51

def move(n,a,b,c):
    if n == 1:
      print (a,'-->',c)
      return 1
    else:
      c1 = move(n-1,a,c,b)#首先需要把 (N-1) 个圆盘移动到 b
      move(1,a,b,c)    #将a的最后一个圆盘移动到c
      c2 = move(n-1,b,a,c)#再将b的(N-1)个圆盘移动到c
      return c1+c2+1
num = int(input('请输入汉诺塔层数:'))
count = move(num,'a','b','c')
print('移动汉诺塔一共需要 %d 次' % count)

地主家的小颖哥 发表于 2018-2-2 22:03:19

这玩意我记忆犹新,递归你最好只考虑最简单的那一部分,就是层次最浅的又‘五脏俱全’的那一部分,汉诺塔 就是三个盘的时候这个明白了,按这个思路写就行,不要考虑那些 多的(十几,二十几的.....会爆炸的{:5_107:}).

暮之洁 发表于 2018-2-3 16:32:40

铁棍阿童木 发表于 2018-2-2 20:12
首先你要理解这个游戏怎么玩,借用你的代码来解释:
1、x y z 分别代表三根轴(或者针),x 代表圆盘最初 ...

我懂了,就是定义函数的时候x,y,z没加引号表示形参,加了引号就是实参,然后将其付给形参

铁棍阿童木 发表于 2018-2-4 09:21:54

暮之洁 发表于 2018-2-3 16:32
我懂了,就是定义函数的时候x,y,z没加引号表示形参,加了引号就是实参,然后将其付给形参

正确
页: [1]
查看完整版本: 零基础入门学习Python中24讲对汉罗塔游戏没懂,求助