当前位置: 首页 > news >正文

汉诺塔算法

汉诺塔问题描述:有A, B, C三个圆柱,其中A上从上至下放置了从小到大n个圆盘,一次只能移动一个圆盘,且大的圆盘不能放在小圆盘之上,要求打印出从A将圆盘移到C的方案。

当n = 1时, A->C
当n = 2时, A->B, A->C, B->C
当n = 3时, [A->C, A->B, C->B,] A->C,[B->A, B->C, A->C]
当n = 4时, A->B, A->C, B->C, A->B, C->A, C->B, A->B,

        A->C, 
        B->C, B->A, C->A, B->C, A->B, A->C, B->C

当n = 5时, A->C, A->B, C->B, A->C, B->A, B->C, A->C,

        A->B, 
        C->B, C->A, B->A, C->B, A->C, A->B, C->B
        
        A->C,
        
        B->A, B->C, A->C, B->A, C->B, C->A, B->A,
        B->C, 
        A->C, A->B, C->B, A->C, B->A, B->C, A->C

当n > 2时,第n项,[A->B],A->C,[B->C]

       第n-1项,A->B  [A->C],A->B,[C->B]    B->C [B->A],B->C,[A->C]
       第n-1-1项,
        第n-1项,A->C(此处的C应该是B),A->C,和第n-1-1项,A->B(此处的B应是C),B->C
        ……
        如此重复,可以用递归求得结果
        

由此,不难看出,计算n个圆盘,所需要的次数为f(n) = 2*f(n-1)+1

代码:

const move=(a,c)=>{
    console.info(`${a}->${c}`)
}

const hanoi = (n,a,b,c)=>{
    if(n === 1){
        move(a,c)
    }else{
        //[A->B]
        hanoi(n-1,a,c,b);
        move(a,c);
        //[B->C]
        hanoi(n-1,b,a,c);
    }
}

参考:从fibonacci和汉诺塔看分治法

相关文章:

  • 使用OTL进行数据库编程
  • Qt中的qrc文件
  • python sys 模块
  • redis可视化工具的安装和调试
  • 两种表复制语句
  • 成员运算符
  • 通过Nagios监控Tomcat服务
  • Wpf 之Canvas介绍
  • 杯具的vmware和virtual box虚拟机转换
  • 【转】keyCode对照表及JS监听组合按键
  • 第41周日思考如何更好的工作
  • WordPress 介绍
  • Python-装饰器详解
  • hexo 常用命令
  • Android各层推荐开发书籍及参考资料
  • 【译】JS基础算法脚本:字符串结尾
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • const let
  • ECMAScript入门(七)--Module语法
  • Github访问慢解决办法
  • httpie使用详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js学习笔记
  • Laravel Telescope:优雅的应用调试工具
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Octave 入门
  • Python3爬取英雄联盟英雄皮肤大图
  • Python进阶细节
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 分享一份非常强势的Android面试题
  • 简单实现一个textarea自适应高度
  • 警报:线上事故之CountDownLatch的威力
  • 什么是Javascript函数节流?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一个项目push到多个远程Git仓库
  • 在weex里面使用chart图表
  • 主流的CSS水平和垂直居中技术大全
  • Semaphore
  • 容器镜像
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​比特币大跌的 2 个原因
  • ​用户画像从0到100的构建思路
  • #每天一道面试题# 什么是MySQL的回表查询
  • (20050108)又读《平凡的世界》
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C语言)fread与fwrite详解
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (k8s中)docker netty OOM问题记录
  • (八)Spring源码解析:Spring MVC
  • (初研) Sentence-embedding fine-tune notebook
  • (黑马C++)L06 重载与继承
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战