借助一个中转柱,使起始柱中按照规则排放的盘子移动到终点柱,且一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
在平常的编程练习过程中,汉诺塔问题也是一个十分常见的算法案例。今天我就和小伙伴们具体分析一下汉诺塔问题的解决方案。
首先我们来看一个三层汉诺塔的图解,来对汉诺塔问题的解决有一个简单的了解:
如上图所示,我们可以看出,当盘子的数量只有一个的时候,我们可以直接将盘子移动到目标盘,在进行三层汉诺塔问题的解决时。我们先将最上方的两个盘子借助目标盘移动至中转盘,再将最大的盘子移动至目标盘,之后再将中转盘上的第一个盘子移动至起始盘,这个时候我们就可以将二号盘移动至目标盘,最后将起始盘上的一号盘移动至目标盘。
由此我们可以总结出n层汉诺塔的解决方案:
将前n-1个盘子借助当前的中转盘(不一定是B托盘)移动至相邻的空托盘上,再将第n个盘子移动至目标盘,之后重复上述步骤直至将所有的盘子都移动至目标盘。在这个也用到了函数方法的递归思想。
接下来分别使用java和Python向大家演示一下n阶汉诺塔的求解方法:
Java求解汉诺塔
package 汉诺塔算法;
public class Hanoi {
public static void main(String[] args) {
// TODO Auto-generated method stub
Hanoi h = new Hanoi();
char a = 'A';
char b = 'B';
char c = 'C';
int count = h.hanoi(3, a, b, c);
System.out.println(count);
}
/**
* 汉诺塔问题
* @param n 阶数
* @param a 起始柱
* @param b 中转柱
* @param c 目标柱
* @return 移动次数
* */
public int hanoi(int n,char a,char b,char c) {
if (n == 1) {
move(a, c);
} else {
hanoi(n-1, a, c, b);
# 总结
**就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!**
**金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://ali1024.coding.net/public/P7/Java/git)**
![三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)](https://s2.51cto.com/images/20210918/1631911706279147.jpg)
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/162390.html