鱼C论坛

 找回密码
 立即注册
查看: 1881|回复: 1

[技术交流] 《零基础入门学习Python》024递归:汉诺塔

[复制链接]
发表于 2017-7-26 13:58:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 1137381680 于 2017-7-26 14:15 编辑

《零基础入门学习Python》
——学习笔记

024递归:汉诺塔

好久没有更新了。不想找什么借口,在这一节卡了很长时间都没弄明白,自己又有些贪玩,浪费了很多时间,对不起大家,更对不起自己。我每学一张新的知识说实话大部分的时间其实并不是在理解上,而是在课后习题上。我不能说题是否偏难,反正我每次如果想全部做完做懂没有两三个小时是绝对下不来的。可能是我比较笨吧。所以一天两节已经是极限了,并且还没有复习,至于复习等全部学完了再重新回头过一遍。现在开始继续学习。

由于这一张定义比较少,我直接开始介绍代码运行步骤
  1. #汉诺塔代码
  2. def hanoi(n, x, y, z):
  3.     if n == 1:
  4.         print(x, ' --> ', z)
  5.     else:
  6.         hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上
  7.         print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上
  8.         hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上

  9. n = int(input('请输入汉诺塔的层数:'))
  10. hanoi(n, 'X', 'Y', 'Z')
复制代码
在这里我主要分析一下我最迷惑的地方。

看过视频的朋友们都知道,汉诺塔这个游戏的解决方法说白了就是隔山打牛,移行换影,借助“中间商”完成所要达到的目的。基本原理讲完了咱们来看第一个我的困惑点。

1.        问:else中的hanoi(n-1,x,z,y)# 将前n-1个盘子从x移动到y上。这行代码怎么理解呢?


答:通过条件我们可以知道,当盘子数大于1时,程序会转到else循环中,如果我们假设总共有七个盘子,那么代码就是这样的
Hanoi(6,x,z,y) #将前6个盘子从x移动到y上
这时候有的朋友可能就和我一样不明白了,明明是从x移动到y,那为什么变的不是x,y的顺序反而变的是y和z的顺序呢?此时我们需要想起:这个程序分解的步骤到底是什么。注释里说从x移动到y,如何移动到y呢?当然要通过z这个中间商进行运作才可以移动到y,那么这行代码也就解释得通了,其实最终的目的还是hanoi(n-1,x,y),z只不过是一个不能忽略的中转站,所以要插在xy之间,说白了不是y改变了位置,而是移动所迫使z不得不去插在xy中间才可以使目的达到。

2.        问:那通过刚才那么一说,第二行的print(x,’’,z) #将最底下的最后一个盘子从x移动到z上该怎么解释呢?
这样由于第一行x,z,y的顺序,z岂不是成了y的位置?


答:大家应该知道,汉诺塔这个游戏是一个固定的模具,不可能把某一个柱子掰折重新插在别的地方,所以x,y,z真正的顺序必然不会改变,一定是按照左中右的顺序来的,至于第一行那里为什么是x,z,y,其实刚才已经说过了,由于移动要求迫使z不得不作为中间商插在xy之间,但是插在xy之间指的并不是真正物理上的插,而是一个逻辑,换位思考而已,只有这样才能够输出让人能看懂的过程。所以在这里大家一定要分清哪里是逻辑,哪里是真正的顺序。

3.        问:哦哦,那逻辑上清楚了,但是整个程序是如何运行的呢?我怎么感觉程序只会运行一次呢?你也没用while循环啊!??


答:在这里给大家强调一下,这才是递归的妙处所在。比方有七个盘子,输入7之后程序会进行判断,7 > 1,好的,进入else循环中,hanoi(7-1,x,z,y) #将前7-1(6)个盘子从x移动到y上,注意,重点在这里。的确将前六个盘子从x移到y,那这6个盘子怎么移动呢?用户并没有输入,系统就需要自己去找,因为它不满足这个循环啊,它并不等于1,所以就去找6,把6重新带入这个循环中,哦,变成了5,4,3,2,直到1,这时候他会从1开始把所有之前找过的都罗列出来,也就呈现出了整个7个盘子从x到z的过程。

4.        问:说了这么多我似乎明白这个的基础原理和运行过程了,但是我还是有点懵,xyz变来变去的到底哪个是哪个啊?


答:在这里我说一下,3个的你能很清晰的理清每一步怎么走,五个的可能也勉强可以,那要是10个呢?一百个呢?一万个呢?这时候你就会发现理不清楚,不知道从哪里开始就乱掉了,毕竟人脑收到的干扰比较多,不可能像计算机一样把东西可以排好位置寄存在内存中。如果真的能理清一万步,那写程序的大部分意义就消失了。我们需要做的就是把最基本的逻辑搞清楚,知道汉堡的基本组成是面包,菜,肉就够了,至于怎么叠,有个初步的想法就可以了,其余交给计算机吧。就像一开始我觉得这个代码不可能跑起来,但是他真的就跑起来了,说到底其实是基础逻辑写对了,这样就是运行十万遍也不会错。
汉诺塔 .jpg

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-26 14:12:10 | 显示全部楼层
真的很对不起订阅我的朋友和关注我的朋友们,对不起对不起对不起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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