C#之汉诺塔(河内塔)递归问题
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#之汉诺塔(河内塔)递归问题相关推荐
- 汉诺塔//河内塔(Tower of Hanoi)
#汉诺塔//河内塔(Tower of Hanoi) #include<#iostream> using namespace std; static int index = 0; void ...
- 2016年圣诞节巨献:C#汉诺塔河内塔游戏(动画、圣诞节音效)源码及安装包
终于把VS的的打包搞定了,高兴啊! 圣诞节巨献:C#汉诺塔河内塔游戏(动画效果.圣诞节音效).在平庸而又乏味的生活中,来一把紧张而刺激的汉诺塔游戏,生活,就是这么美好.游戏代码可以在博主的资源页下载! ...
- 汉诺塔(河内塔)问题(递归)
Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说.开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A.B和C,A上面套着 n 个圆的金片,最大的一个在底下,其余一个比一个小,依次 ...
- 八个方面分析汉诺塔问题
汉诺塔是什么? 汉诺塔问题就是将A柱上n个圆全部移动到C上,过程中可以借助B柱,但要始终保持小圆在大圆上面. 1.自顶向下 逐步求精 "自顶向下, 逐步求精"是一种结构化程序设计常 ...
- 【码蹄集】四柱河内塔
题目:四柱河内塔 河内塔问题: 有三个柱子,编号为1,2,3;在编号为1的柱子上有n个大小不同圆盘,圆盘从小到大,从上到下堆叠,你只可以移动-个柱子上最上面的圆盘. 现在你需要将编号为1的柱子上的圆盘 ...
- 汉诺塔(河内塔)问题解析(函数递归经典问题)
目录 1. 题目描述 2. 题目目标 3. 题目分析 1. 题目描述 在一块铜板装置上,有三根杆(编号A.B.C),在A杆自上而下.由大到下按顺序放置n个盘子. 2. 题目目标 把A杆上的盘子全部转移 ...
- 递归之河内塔,汉诺塔问题(婆罗贺摩塔:Tower of Brahma)
THE TOWER OF HANOL :河内塔问题 河内塔问题是由法国数学家爱德华·卢卡斯于1883年发明的,给定一个由8个圆组成的塔,这些圆盘按照从大到小递减的方式套在三根桩柱中的一根上. 我们的目 ...
- 具体数学 递归问题1.1 从河内塔/汉诺塔开始
河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...
- 个盘子的汉诺塔需要移动几步_图解汉诺塔问题( Java 递归实现)
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...
最新文章
- python2.7 Cheetah You don't have the C version of NameMapper installed
- js跟随鼠标移动的写法
- EJS学习(一)之特性、安装、工作原理
- DrawTool画笔之图形笔
- 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
- Solr缓存清空、重新加载与修改
- OpenCV之图像混合
- LabVIEW编程LabVIEW开发 PXI-4070数字万用表 例程与相关资料
- 运行 java applet_创建运行第一个Java Applet程序
- java后台怎么解密md5,Java md5 密码加解密
- Android 实现小红书登陆页面背景图无限滚动效果
- 关于消防设施的RFID资产管理,RFID消防设施资产管理-新导智能
- 阿里云公共DNS安全传输服务介绍(DoH/DoT)
- haster、setattr、getattr的区别
- 【嵌入式Linux驱动开发】二十一、Linux内核自带的KEY驱动探索
- android shape 无边框颜色,Android 使用shape定义不同控件的的颜色、背景色、边框色...
- 区块链游戏公司 区块链游戏开发成本 区块链游戏开发时间
- 微软股价 2019 年飙升 55.3%,创十年来最佳表现!
- git cherry-pick的注意事项
- 1小时轻松学会用Excel做数据分析