鱼C论坛

 找回密码
 立即注册
查看: 4693|回复: 7

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

[复制链接]
发表于 2018-2-2 18:13:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题如下:
1.else后面到底是怎么运行的
2.函数后面x,y,z交换顺序有什么作用
3.调用函数时为什么要加引号
最佳答案
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不会执行内部代码。

问题是函数中x,y,z交换位置是为什么,最后调用函数为什么要用引号

问题是函数中x,y,z交换位置是为什么,最后调用函数为什么要用引号
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-2-2 18:28:55 From FishC Mobile | 显示全部楼层
1参考
http://bbs.fishc.com/thread-79183-1-1.html
2 用来表示每一步的操作
3 因为只需要字符串作为形参
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-2 19:43:47 | 显示全部楼层
递归我一脸懵逼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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不会执行内部代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-2-2 22:03:19 | 显示全部楼层
这玩意我记忆犹新,递归你最好只考虑最简单的那一部分,就是层次最浅的又‘五脏俱全’的那一部分  ,汉诺塔 就是三个盘的时候这个明白了,按这个思路写就行,不要考虑那些 多的(十几,二十几的.....  会爆炸的).
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我懂了,就是定义函数的时候x,y,z没加引号表示形参,加了引号就是实参,然后将其付给形参
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表