最近在廖雪峰大神的教程学习python

学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法。这markdown编辑器还不怎么会用,可能写的有点格式有点丑啦,各位看官多多见谅.

网上找了一张汉诺塔的图片,汉诺塔就是利用用中间的柱子把最左边的柱子上的圆盘依次从大到小叠上去,说白了就是c要跟原来的a同样

废话少说,先亮代码python

def move(n, a, buffer, c):

if(n == 1):

print(a,"->",c)

return

move(n-1, a, c, buffer)

move(1, a, buffer, c)

move(n-1, buffer, a, c)

move(3, "a", "b", "c")

首先是定义了一个移动的函数,四个参数分别表明,a柱上的盘子个数,buffer也就是b柱,命名为buffer便于理解,顾名思义就是一个a移动到c的缓冲区.而后c就是目标柱子

下面咱们来读函数代码

递归的通常写法,确定有个停止递归循环的条件,因此在判断a柱上的盘子个数为1的时候既能够停止递归并返回,a柱上面只有一个的时候确定就是把a移动到c了,重点是下面的代码,递归实际上是一种很抽象的算法,咱们要利用抽象思惟去想汉诺塔这个问题,把a柱上的盘子想成两份,就是上面的盘子和最底下的盘子,若是所示

咱们不关心上面的盘子到底有几个,咱们每次的操做就是把最底下的盘子经过缓冲区 b柱 buffer 移动到c柱。

童鞋们确定在想为啥要酱紫移动呢,其实这是一种总结概括吧,你本身玩一下汉诺塔游戏就会发现规律,其实这个游戏就是不停的把上面的全部的千方百计的移到b上,而后把a最后最大的那个弄到c,而后再绞尽脑汁的把b上的移动到c,这时候你就发现,原来b上的也要先经过空的也就是a来存放当前b上面的n-1个,而后把b的最大最后的移动到c,这里规律就体现出来了,也能够抽象出移动的方法,并能够以此设计出程序算法.

如下咱们来利用刚才的抽象思惟解读剩余代码web

move(n-1, a, c, buffer)

这段代码就是表示把刚才所说的a柱的上面的n-1个,经过c按照从小到大的规则先移动到缓冲区buffer。此函数进入递归。算法

move(1, a, buffer, c)

当上面的语句执行完成,也就是n-1个盘子的递归移动完成以后,执行此语句,就是把a柱上的一个盘子移动到c,也就是所谓的最底下的盘子markdown

move(n-1, buffer , a, c)

最后一步,就是刚才把a上面的n-1个都移动到了buffer上面,确定要经过a移动到c才能完成整个汉诺塔的移动啊,因而最后一步天然是把刚才的n-1个经过a当缓冲区移动到c柱上.

我来写下整个移动流程,以a柱上有3个为例子编辑器

/**

我把3个盘子的汉诺塔所有经过代码演示,按缩进原则,每个缩进即进一个递归函数,每打印一次即停止当前递归,也就是每一个print

说明:

1.n = 3, n = 2, n = 1是每次执行if(n == 1)的结果,这里就不写判断了,相信童鞋们也能看懂,也就是n不等与1时就减1进入递归

2.请注意a,b,c柱每次进入函数的顺序,不要被形参带错路了,看准每次函数参数的实参

**/

move(3, "a", "b", "c")

n=3:

//开始从a上移动n-1即2个盘子经过c移动到b,以腾出c供a最后一个盘子移动

move(2, "a","c","b")

n=2:

//开始进行n=2的一个递归,把当前a('a')柱上的n-1个盘子经过c('b')移动到b('c')

move(1, "a", "b", "c")

n=1:

//n=2的第一个递归完成,打印结果,执行当前子函数剩余代码

print("a", "->", "c")

move(1, "a", "c", "b")

n=1:

print("a", "->", "b")

move(1, "c", "a", "b")

n=1:

print("c", "->", "b")

//到这里完成了a柱上面的n-1便是2个盘子的移动

//开始把a柱上最后一个盘子移动到c柱上

move(1, "a", "b", "c")

n=1:

print("a", "->", "c")

//到这里完成移动a柱上的最后一个盘子到c柱上

move(2, "b", "a", "c")

n=2:

//开始进行n=2的第二个递归,即把当前b('b')的盘子(n-1个)经过a('a')移动到c('c')上

move(1, "b", "c", "a")

n=1:

//n=2 的第二个递归完成,打印结果并执行当前子函数的剩余代码

print("b", "->", "a")

move(1, "b", "a", "c")

n=1:

print("b", "->", "c")

move(1, "a", "b", "c")

n=1:

print("a", "->", "c")

//到这里把b上的盘子经过a移动到c,

//整个代码执行完毕,汉诺塔移动完成

最后的打印结果为:

童鞋们理解了汉诺塔的递归算法原理后,能够写个程序来试试,这里只是学到Python的递归因此用了Python,童鞋们能够用其余语言实现,汉诺塔确实能帮助理解递归原理,递归在程序设计中的重要性不言而喻啦,本人水平鶸,大牛们拍砖轻点,有意见和建议请指出,能获得大牛们的指点,小弟感激涕零,有兴趣的童鞋们欢迎留言讨论,你们一块儿进步. svg

汉诺塔python创新设计_递归经典案例汉诺塔 python实现相关推荐

  1. python递归函数例子_Python递归函数经典案例-汉诺塔问题

    汉诺塔 汉诺塔问题是递归算法学习的一个经典案例,首先来看下汉诺塔问题的相关描述: 汉诺塔问题起源于一个古老的印度传说,大梵天创世时制作了三根金刚石石柱,在第一根柱子上从上往下从小到大摞着64片金盘,婆 ...

  2. 初识python 教学设计_青岛版八年级《初识Python》教学设计.doc

    PAGE PAGE 2 第4课 初识Python教学设计 [教学目标] 1.知识与技能:了解python编程语言起源以及应用,知道python编辑器的常用用法,掌握利用python编写程序的一般步骤. ...

  3. python回调接口_三个案例带你了解python回调函数

    原标题:三个案例带你了解python回调函数 回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用 ...

  4. python的函数调用_三个案例带你了解python回调函数

    回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用 ...

  5. 《不只是美:信息图表设计原理与经典案例》—— 2.5 功能限制形式

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第2章,第2.5节,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公 ...

  6. 《不只是美:信息图表设计原理与经典案例》—— 第2章 形式与功能:可视是一种技术...

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第2章,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  7. 《不只是美:信息图表设计原理与经典案例》—— 1.1 理性乐观派观派

    本节书摘来异步社区<不只是美:信息图表设计原理与经典案例>一书中的第1章,第1.1节,作者:[美]Alberto Cairo,更多章节内容可以访问云栖社区"异步社区"公 ...

  8. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  9. 汉诺塔python创新设计大赛_2020年第七届 INNODESIGN PRIZE 国际创新设计大赛

    奖金:无奖金 我们再度邀请世界各地拥有创新梦想的设计师,一起"探索创新设计,引领行业边界",探讨设计如何在多元化发展中实现多学科的融合与交叉,为社会.经济.科技等议题寻求创新解决方 ...

最新文章

  1. mysql主从读写Windows_Windows操作系统下的MySQL主从复制及读写分离
  2. TJU Problem 1065 Factorial
  3. NUXT 入门第一课: 关于 Nuxt.js
  4. Android如何获得手机power_profile.xml文件
  5. 文件下载--服务器端编程操作
  6. arcgis使用工具箱导出dbf_ArcGIS——好好的属性表,咋就乱码了呢?
  7. 在Java里重写equals和hashCode要注意什么问题
  8. 计算机等级考试机试试题,计算机等级考试二级VFP机试试题18
  9. fragtats中平均临近距离(PROX_MN)的具体解释
  10. 【C语言】删除元素(函数,数组的扫描)
  11. eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.proje...
  12. 16款有助于提升工作效率的工具
  13. 证书激励法——VBA课程第二次讨论2007年12月6日
  14. java replaceall删除中括号和内容_replaceAll()如何同时替换多个不同的字符串(或多个符号)...
  15. webbrowser控件使用,冬日日记每一天
  16. cmpp20协议对接
  17. 关于三极管的理解---根据IC符号简易迅速判断三极管导通情况
  18. 微信扫码登录,微信公众号生成二维码,关注登录nodejs+vue
  19. bzoj5020[THUWC 2017]在美妙的数学王国中畅游(LCT)
  20. 最具就业前景的 7 大编程语言有哪些?

热门文章

  1. 你知道PMU与PMU的区别吗?
  2. Obsidian看板指北
  3. Android UI 测试框架Espresso详解
  4. 如何提升公众号关注率,让用户看完文章关注你
  5. 如何做好SEM竞价营销
  6. 黑龙江民族职业学院数据备份集成
  7. 世间所有,逃不过一个“缘”字
  8. win10 sublime text3配置c++
  9. 大数据与机器学习算法相关的电子书分享
  10. 解决“Could not build wheels for xx which use PEP 517 and cannot be installed directly“问题