C#之汉诺塔(河内塔)递归问题

  • 前言
  • 一、汉诺塔问题
  • 二、问题思考
    • 1.简单定义一下
    • 2.假设简单的情况
    • 3.推广
    • 4.核心代码
  • 总结

前言

小时候在直板手机上玩过这么一款叫做“汉诺塔”的游戏,游戏方式很简单,通过上下左右四个按键将一堆大小有序、垂直排列的圆盘从一根柱子上移动到另一根柱子上,小时候也懒得思考就是在瞎玩。现在用递归的思想来解决一下这个问题,我尽可能把我自己的理解方式通俗的讲给大家,如有不对的地方,请大家批评指正!

一、汉诺塔问题

我们就依照这个图上所说的64个圆片来解决问题(图片出处:刘铁猛老师)

二、问题思考

1.简单定义一下

这里为了表达更清楚,我们定义一下:
三根柱子分别为A柱,B柱,C柱。
Px代表柱上的圆片,P1代表从上至下第一个圆片(也就是最小的那个圆片),同理,P64代表从上至下最后一个圆片(也就是最大的那个圆片)。
Nm~n代表把Pm与Pn(包括Pm和Pn本身)之间所有的圆片移动到另外一根柱子上所用的次数。
例如,N1~63代表把P1与P63(包括P1和P63本身)之间所有的圆片移动到另一根柱子上所用的次数。

2.假设简单的情况

这里我们先来假设一种比较简单的情况,如图,三根柱子(A,B,C),3个圆盘,P1,P2,P3

那么我们思考一下,想把全部的圆盘移动到另外一根柱子上需要怎么做?
首先:把P1和P2移动到C柱上,这样做的目的是为了把P3暴露出来以便可以移动(这里先不管具体操作了多少步,而是从整体上考虑应该怎么做)

其次:把P3移动到B柱上

最后:把P1和P2移动到B柱上

至此,我们一共做个3件事情:
1.把除了最大圆盘以外的其余圆盘从A柱移动到C柱(即:把P1和P2从A柱移动到C柱)
2.把最大圆盘从A柱移动到B柱(即:把P3从A柱移动到B柱)
3.把除了最大圆盘以外的其余圆盘从C柱移回到B柱(即:把P1和P2从C柱移动到B柱)

到这里我们应该能发现两个比较重要的问题:
(1)如果我们把除最大圆盘以外的其他圆盘看作一个整体,那么这个整体被移动了两回(从A柱到C柱,从C柱到B柱),我们假设这个整体被移动一回所需要的次数为N
(2)当(1)中的整体被移动以后,所暴露出来最大的那个圆盘,只需要移动一次(从A柱到C柱)

so,我们完成整个流程所需要的次数是N+1+N(移动整体+移动最大的+移动整体)。
but,这个整体怎么办呢?这个整体就接着用这个方法再去解决,一层一层的,这就是递归的思想啦,我们接下来用题目的例子详细讲一下

3.推广

现在我们来看题目中的问题,64个圆盘,3根柱子

依照我们之前的思想,现在我们解决N1~64(即:整体移动P1至P64所需次数)
  (1.1)把P1至P63看作一个整体,移动到另外一个柱子上,所需次数为N1~63
  (1.2)接着移动P64,所需次数为1次
  (1.3)把P1至P63移动回来,所需次数为N1~63
  (1.4)N1~64 = N1~63 + 1 + N1~63
       N1~63怎么算?(即:整体移动P1至P63所需次数)
     (2.1)把P1至P62看作一个整体,移动到另外一个柱子上,所需次数为N1~62
     (2.2)接着移动P63,所需次数为1次
     (2.3)把P1至P62移动回来,所需次数为N1~62
     (2.4)N1~63 = N1~62 + 1 + N1~62
        N1~62怎么算?(即:整体移动P1至P62所需次数)
        ·
        ·(…此处省略中间的步骤…)
        ·
          N1~2怎么算?(即:整体移动P1至P2所需次数)
        (63.1)把P1看作一个整体,移动到另外一个柱子上,所需次数为N1
        (63.2)接着移动P2,所需次数为1次
        (63.3)把P1移动回来,所需次数为N1
        (63.4)N1~2 = N1 + 1 + N1
             N1怎么算?(即:整体移动P1所需次数)
           (64.1)N1就很简单了,那当然就是1啦!
           (64.2)N1~2 = N1 + 1 + N1

4.核心代码

        public int Hanoi(int num)//参数num代表圆盘数{if(num == 1){return 1;}else{//特别提醒:下面的result用的是int类型,如果参数num输入的是题目中的64,得到的结果是不正确的,因为已经超过了int类型的最大值,因此,需要变为long型或者double型来接收结果或者将参数num减小//1和2方法都可以,但2似乎更快?//1.int result = Hanoi(num - 1)  + 1 + Hanoi(num - 1);//2.int result = Hanoi(num - 1)*2 + 1;return result;}}

总结

本文简单介绍了递归思想在汉诺塔问题中的应用,文笔有限,若文章中有不当之处,还望各位批评指正!

C#之汉诺塔(河内塔)递归问题相关推荐

  1. 汉诺塔//河内塔(Tower of Hanoi)

    #汉诺塔//河内塔(Tower of Hanoi) #include<#iostream> using namespace std; static int index = 0; void ...

  2. 2016年圣诞节巨献:C#汉诺塔河内塔游戏(动画、圣诞节音效)源码及安装包

    终于把VS的的打包搞定了,高兴啊! 圣诞节巨献:C#汉诺塔河内塔游戏(动画效果.圣诞节音效).在平庸而又乏味的生活中,来一把紧张而刺激的汉诺塔游戏,生活,就是这么美好.游戏代码可以在博主的资源页下载! ...

  3. 汉诺塔(河内塔)问题(递归)

    Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说.开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A.B和C,A上面套着 n 个圆的金片,最大的一个在底下,其余一个比一个小,依次 ...

  4. 八个方面分析汉诺塔问题

    汉诺塔是什么? 汉诺塔问题就是将A柱上n个圆全部移动到C上,过程中可以借助B柱,但要始终保持小圆在大圆上面. 1.自顶向下 逐步求精 "自顶向下, 逐步求精"是一种结构化程序设计常 ...

  5. 【码蹄集】四柱河内塔

    题目:四柱河内塔 河内塔问题: 有三个柱子,编号为1,2,3;在编号为1的柱子上有n个大小不同圆盘,圆盘从小到大,从上到下堆叠,你只可以移动-个柱子上最上面的圆盘. 现在你需要将编号为1的柱子上的圆盘 ...

  6. 汉诺塔(河内塔)问题解析(函数递归经典问题)

    目录 1. 题目描述 2. 题目目标 3. 题目分析 1. 题目描述 在一块铜板装置上,有三根杆(编号A.B.C),在A杆自上而下.由大到下按顺序放置n个盘子. 2. 题目目标 把A杆上的盘子全部转移 ...

  7. 递归之河内塔,汉诺塔问题(婆罗贺摩塔:Tower of Brahma)

    THE TOWER OF HANOL :河内塔问题 河内塔问题是由法国数学家爱德华·卢卡斯于1883年发明的,给定一个由8个圆组成的塔,这些圆盘按照从大到小递减的方式套在三根桩柱中的一根上. 我们的目 ...

  8. 具体数学 递归问题1.1 从河内塔/汉诺塔开始

    河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...

  9. 个盘子的汉诺塔需要移动几步_图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...

最新文章

  1. python2.7 Cheetah You don't have the C version of NameMapper installed
  2. js跟随鼠标移动的写法
  3. EJS学习(一)之特性、安装、工作原理
  4. DrawTool画笔之图形笔
  5. 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
  6. Solr缓存清空、重新加载与修改
  7. OpenCV之图像混合
  8. LabVIEW编程LabVIEW开发 PXI-4070数字万用表 例程与相关资料
  9. 运行 java applet_创建运行第一个Java Applet程序
  10. java后台怎么解密md5,Java md5 密码加解密
  11. Android 实现小红书登陆页面背景图无限滚动效果
  12. 关于消防设施的RFID资产管理,RFID消防设施资产管理-新导智能
  13. 阿里云公共DNS安全传输服务介绍(DoH/DoT)
  14. haster、setattr、getattr的区别
  15. 【嵌入式Linux驱动开发】二十一、Linux内核自带的KEY驱动探索
  16. android shape 无边框颜色,Android 使用shape定义不同控件的的颜色、背景色、边框色...
  17. 区块链游戏公司 区块链游戏开发成本 区块链游戏开发时间
  18. 微软股价 2019 年飙升 55.3%,创十年来最佳表现!
  19. git cherry-pick的注意事项
  20. 1小时轻松学会用Excel做数据分析

热门文章

  1. Android View 详解
  2. Origin2021 三维图的绘制_个别点中垂线绘制
  3. uni-app mescroll-body的用法
  4. Easy CHM 使用手册
  5. 多层高速PCB设计学习笔记(四)四层板实战(上)之常见模块要求
  6. 音频监控叫好又叫座 核心部件拾音器怎么装?
  7. idea 2021.3 启动不了
  8. 如何使用网络调试助手调试UDP
  9. jxls模板hashmap_JXLS根据模板导出Excel实例教程
  10. 同时安装 ensp HCL