|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 1137381680 于 2017-7-26 14:15 编辑
《零基础入门学习Python》
——学习笔记
024递归:汉诺塔
好久没有更新了。不想找什么借口,在这一节卡了很长时间都没弄明白,自己又有些贪玩,浪费了很多时间,对不起大家,更对不起自己。我每学一张新的知识说实话大部分的时间其实并不是在理解上,而是在课后习题上。我不能说题是否偏难,反正我每次如果想全部做完做懂没有两三个小时是绝对下不来的。可能是我比较笨吧。所以一天两节已经是极限了,并且还没有复习,至于复习等全部学完了再重新回头过一遍。现在开始继续学习。
由于这一张定义比较少,我直接开始介绍代码运行步骤#汉诺塔代码
def hanoi(n, x, y, z):
if n == 1:
print(x, ' --> ', z)
else:
hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上
print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上
hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上
n = int(input('请输入汉诺塔的层数:'))
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个呢?一百个呢?一万个呢?这时候你就会发现理不清楚,不知道从哪里开始就乱掉了,毕竟人脑收到的干扰比较多,不可能像计算机一样把东西可以排好位置寄存在内存中。如果真的能理清一万步,那写程序的大部分意义就消失了。我们需要做的就是把最基本的逻辑搞清楚,知道汉堡的基本组成是面包,菜,肉就够了,至于怎么叠,有个初步的想法就可以了,其余交给计算机吧。就像一开始我觉得这个代码不可能跑起来,但是他真的就跑起来了,说到底其实是基础逻辑写对了,这样就是运行十万遍也不会错。
|
-
评分
-
查看全部评分
|