汉诺塔算法python_经典算法:汉诺塔
学编程,学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_经典算法:汉诺塔相关推荐
- k近邻回归算法python_经典算法之K近邻(回归部分)
1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ...
- 河内之塔问题——《经典算法》
本题来自经典算法 说明: 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时 北越的首都,即现在的胡志明市:1883年法国数学家 ...
- 计算机语言算法大全,经典算法大全
标签: 算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求 ...
- java 所有路径算法_经典算法题:二叉树的所有路径
一.题目 给定一个二叉树,返回所有从根节点到叶子节点的路径. 二.思路 回溯算法 三.实现 public List binaryTreePaths(TreeNode root) { List res ...
- [转载] 令牌桶算法和漏桶算法python_排序算法(七):Bucket Sort 桶排序
参考链接: 用Python进行存储桶Bucket Sort排序 Couting Sort 计数排序虽然快,但其只能对整数进行排序有一点的局限性.而 Bucket Sort 桶排序则没有这个限制.这里我 ...
- 计算机大赛算法,计算机经典算法——锦标赛排序算法
关键词:二叉树 生活中的淘汰锦标赛:在单淘汰的锦标赛中,选手们两两比赛,胜者晋级,败者被淘汰.比如世界乒乓球锦标赛或者大满贯网球赛就是这么进行的. 这样一来,就可以把比赛的赛程和结果对应成一个二叉树. ...
- 货郎担问题java算法_经典算法(1)---货郎担问题
一.货郎担问题 货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它.该问题的基本描述是:某售货员要到若干个村庄售货,各村庄之间的路程是已知的,为了提高效率,售货员决定从所在商 ...
- 人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......
本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...
- 人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区...
本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...
最新文章
- 一起走进自然语言处理的世界
- 利用curl并发来提高页面访问速度
- 好用的 Abyss Web Server
- 使用ant design Pro开发项目的小结
- 【2018.10.2】Note of CXM
- 进程间通信-Queue(python版)
- CVPR 2022 | 旷视研究院入选论文亮点解读
- MapReduce基础
- 【hiho挑战赛24 ABC】贪心和期望dp惨烈的后缀自动机
- 802.11介质访问控制——CSMA/CD协议详解
- BZOJ 2882 后缀数组的傻逼实现
- Microsoft Access 查询
- DNS污染攻击详细教程
- 【QNX Hypervisor 2.2 用户手册】1.3 QNX hypervisor架构
- Java实现Zip压缩包解压
- Java字节码编程之非常好用的javassist
- 2022淘宝天猫京东头部主播消失后的618没有头部主播怎么领618红包?
- 欲报从速,已有56所高校选择云创大学高质量免费直播授课!
- 【数据处理】xml的创建、读写问题
- 10个预训练模型开始你的深度学习(计算机视觉部分)
热门文章
- c语言实训模块化程序设计,C语言 实验三 模块化程序设计.doc
- 布尔类型的值包括( )和( )_布尔类型
- lisp 线性标注自动避让_CAD局部放大图如何标注对应的尺寸,才能保持尺寸值不变...
- 深入理解javascript原型和闭包(8)——简述【执行上下文】上
- openstack swift middleware开发
- 卧槽,别人家的黑客增长!
- 数据处理奇技巧——python数据处理小技能
- 入门 | 32 个常用 Python 实现
- 山东旅游学院2021高考成绩查询,2021年山东旅游职业学院录取查询入口,高考录取结果查询网址登录...
- python生成随机数方法_Python生成随机数的方法