学编程,学IT,算法也是必不可缺的,这一次给大家带来一个经典的递归算法题,汉诺塔。算是算法的入门小题目之一吧~

视频教程

什么是汉诺塔?

我这里直接拉来一个图解释一下(挂了请联系我)

就是这么一个东西了,把所有的圆盘从左边移动到右边,并且大的圆盘不能够压住小的。怎么才能完成呢?

规则理解了,开始钻牛角尖

先来看看只有一个圆盘的情况,

嗯 相当的简单 A--->C 就可以了

两个的情况呢? 也不难 A--->B A--->C B--->C

三个的话有点挑战了 大家自己推一推

好的 十个呢?就算想了半天弄好了,怎么让程序帮我们做呢?头大!

牛角尖钻完了,冷静分析

在我们每次距离对称最近的状态,都是把最大的圆盘放到了最右边,剩下的圆盘放到了中间。

然后把中间的再都放到右边就好了

这道理就跟把大象装冰箱一样啊 都是三步呢!

这时候千万不要去想怎么把n-1层都搬到B柱 也不要想怎么把N-1层都搬到C柱,如果继续想下去你就会进入死循环,这时候你只需要做一个思维转换。

当我们把n-1层都搬到了中间柱的时候,只需要把最大的那个盘,从A搬到C柱就好了,剩下的怎么办呢?C柱永远是目标柱,我们不需要去移动它。这时候我们大点力!把B柱子掰下来!扔到A前面!无视掉C柱上面的大圆盘,因为我们不会再去动它了!是不是画面似曾相识?对啊!递归啊!继续把最左边的n-1层都弄到中间,最大的扔到C就好了啊!

看到这里如果你还在钻牛角尖的话,可以暂时休息一下了。

思维转换完成的过来写代码!

// JS写一下

function move(num,from,button,to){

// 如果只有一个圆盘

if(num==1){

console.log(from,"---->",to)

// 最左边的放到最后边完了个事!

return

}

// 如果柱子有点多咋办呢?

// 先把n-1个左边的放到中间呗

move(num-1,from,to,button) //放过去了,具体过程是啥?我特么哪里知道 它里面怎么操作?管他呢,反正他自己知道自己干了啥

console.log(from,"---->",to) // 我就干一件事,我就把左边最大的放到右边,虽然我不知道现在我是不是真正的左边,我可能是被你大力从中间拽过来的左边。

// 放完了然后呢?

// 把所有中间的柱子扔到最右边去

move(num-1,button,from,to)

}

move(3,"A","B","C") //测试一下

//golang

package main

import (

"fmt"

)

func main() {

move(3,"A","B","C")

}

func move(num int,from string,button string,to string){

if num==1 {

fmt.Printf("%s--->%s\n",from,to)

return

}

move(num-1,from,to,button)

fmt.Printf("%s--->%s\n",from,to)

move(num-1,button,from,to)

}

# python

def move(num ,fro,button,to)

if (num==1)

print(fro,'--->',to)

return

move(num-1,fro,to,button)

print(fro,'--->',to)

move(num-1,button,fro,to)

move(3,'A','B','C')

总结

递归这个东西,千万不可钻牛角尖,把大问题分成小问题,复杂问题简单化,如果非要把递归过程推出来的话,那谁都救不了你

欢迎大家关注我的博客,里面会有我所写博客的视频版本,如果你有更多疑问或者想学前端的话,可以加我微信shouzi_1994或者在博客下方品论留言,三大Q.

汉诺塔算法python_经典算法:汉诺塔相关推荐

  1. k近邻回归算法python_经典算法之K近邻(回归部分)

    1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ...

  2. 河内之塔问题——《经典算法》

    本题来自经典算法 说明: 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时 北越的首都,即现在的胡志明市:1883年法国数学家 ...

  3. 计算机语言算法大全,经典算法大全

    标签: 算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求 ...

  4. java 所有路径算法_经典算法题:二叉树的所有路径

    一.题目 给定一个二叉树,返回所有从根节点到叶子节点的路径. 二.思路 回溯算法 三.实现 public List binaryTreePaths(TreeNode root) { List res ...

  5. [转载] 令牌桶算法和漏桶算法python_排序算法(七):Bucket Sort 桶排序

    参考链接: 用Python进行存储桶Bucket Sort排序 Couting Sort 计数排序虽然快,但其只能对整数进行排序有一点的局限性.而 Bucket Sort 桶排序则没有这个限制.这里我 ...

  6. 计算机大赛算法,计算机经典算法——锦标赛排序算法

    关键词:二叉树 生活中的淘汰锦标赛:在单淘汰的锦标赛中,选手们两两比赛,胜者晋级,败者被淘汰.比如世界乒乓球锦标赛或者大满贯网球赛就是这么进行的. 这样一来,就可以把比赛的赛程和结果对应成一个二叉树. ...

  7. 货郎担问题java算法_经典算法(1)---货郎担问题

    一.货郎担问题 货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它.该问题的基本描述是:某售货员要到若干个村庄售货,各村庄之间的路程是已知的,为了提高效率,售货员决定从所在商 ...

  8. 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  9. 人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区...

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

最新文章

  1. 一起走进自然语言处理的世界
  2. 利用curl并发来提高页面访问速度
  3. 好用的 Abyss Web Server
  4. 使用ant design Pro开发项目的小结
  5. 【2018.10.2】Note of CXM
  6. 进程间通信-Queue(python版)
  7. CVPR 2022 | 旷视研究院入选论文亮点解读
  8. MapReduce基础
  9. 【hiho挑战赛24 ABC】贪心和期望dp惨烈的后缀自动机
  10. 802.11介质访问控制——CSMA/CD协议详解
  11. BZOJ 2882 后缀数组的傻逼实现
  12. Microsoft Access 查询
  13. DNS污染攻击详细教程
  14. 【QNX Hypervisor 2.2 用户手册】1.3 QNX hypervisor架构
  15. Java实现Zip压缩包解压
  16. Java字节码编程之非常好用的javassist
  17. 2022淘宝天猫京东头部主播消失后的618没有头部主播怎么领618红包?
  18. 欲报从速,已有56所高校选择云创大学高质量免费直播授课!
  19. 【数据处理】xml的创建、读写问题
  20. 10个预训练模型开始你的深度学习(计算机视觉部分)

热门文章

  1. c语言实训模块化程序设计,C语言 实验三 模块化程序设计.doc
  2. 布尔类型的值包括( )和( )_布尔类型
  3. lisp 线性标注自动避让_CAD局部放大图如何标注对应的尺寸,才能保持尺寸值不变...
  4. 深入理解javascript原型和闭包(8)——简述【执行上下文】上
  5. openstack swift middleware开发
  6. 卧槽,别人家的黑客增长!
  7. 数据处理奇技巧——python数据处理小技能
  8. 入门 | 32 个常用 Python 实现
  9. 山东旅游学院2021高考成绩查询,2021年山东旅游职业学院录取查询入口,高考录取结果查询网址登录...
  10. python生成随机数方法_Python生成随机数的方法