算法(9)汉诺塔图解及其代码实现
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。
技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活
。
相关文章
点此查看 【算法系列】 博客文章
目录
- 一、什么是汉诺塔
- 二、汉诺塔移动过程
- 三、汉诺塔算法思想
- 1.示例代码
- 2.延伸问题
一、什么是汉诺塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、汉诺塔移动过程
汉诺塔动画: 演示圆盘移动过程
(此动图来源于网络)
下面分三种情况分别演示每个盘子的移动过程(n 代表圆盘数量):
1个圆盘的情况:
2个圆盘的情况:
3个圆盘的情况:
三、汉诺塔算法思想
当 n 等于 1 的时候,直接把圆盘从 A 移动到 C;
当 n > 1 的时候:
把 A 柱子上面的 (n-1) 个盘子,从 A 移动到 B;
把 A 柱子上面的第 n 个盘子由 A 移动到 C;
把第一步 B 柱子上的 (n-1) 个盘子由 B 移动到 C
在算法的实现过程中,我们利用递归的思想。来模拟移动过程以及总共移动的次数。
1.示例代码
public class Hanoi {/*** 移动的次数*/static int m = 0;public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("玩汉诺塔,请输入圆盘的个数:");int n = input.nextInt();char a = 'A';char b = 'B';char c = 'C';hanoi(n, a, b, c);System.out.println("把A上的圆盘都移动到了C上,总共移动了" + m + "次。");}/*** 汉诺塔** @param n 盘子的数量* @param a 柱子 A* @param b 柱子 B* @param c 柱子 C*/public static void hanoi(int n, char a, char b, char c) {if (n == 1) {move(1, a, c);} else {// 递归 把A柱子上面的n-1层,从A,经C,到Bhanoi(n - 1, a, c, b);move(n, a, c);// 递归 把B柱子上的n-1层,从B,经A,到Chanoi(n - 1, b, a, c);}}/*** 移动** @param n 圆盘的个数* @param i 移动前的位置* @param j 移动后的位置*/public static void move(int n, char i, char j) {m++;System.out.println("第" + m + "次: " + n + "号圆盘: " + i + " -> " + j);}
}
代码执行结果:
玩汉诺塔,请输入圆盘的个数:3
第1次: 1号圆盘: A -> C
第2次: 2号圆盘: A -> B
第3次: 1号圆盘: C -> B
第4次: 3号圆盘: A -> C
第5次: 1号圆盘: B -> A
第6次: 2号圆盘: B -> C
第7次: 1号圆盘: A -> C
把A上的圆盘都移动到了C上,总共移动了7次。
2.延伸问题
如果移动一个圆盘需要1秒钟的话,等到64个圆盘全部重新落在一起,需要多少长时间?
1个圆盘的时候,2的1次方减1
2个圆盘的时候,2的2次方减1
3个圆盘的时候,2的3次方减1
4个圆盘的时候,2的4次方减1
…
n个圆盘的时候,2的n次方减1
当 n=64的时候是(2的64次方减1)次。
代码示例:
public class Test {public static void main(String[] args) {double a = Math.pow(2, 64) - 1;System.out.println("2^64-1的值: " + a);// 移动一个圆盘需要1秒,一年可以移动b个圆盘double b = 60 * 60 * 24 * 365;System.out.println("一年时间移动圆盘的个数: " + b);// 移动64个圆盘需要的时间double time = a / b;System.out.println("移动64个圆盘需要的时间: " + time + " 年");}
}
代码执行结果:
2^64-1的值: 1.8446744073709552E19
一年时间移动圆盘的个数: 3.1536E7
移动64个圆盘需要的时间: 5.84942417355072E11 年
移动完所有的圆盘大概需要5849亿年,这是一个多么可怕的数字!
上一篇 算法(8)利用循环法和辗转相除法求 最大公约数和最小公倍数
算法(9)汉诺塔图解及其代码实现相关推荐
- c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)
第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...
- 经典算法之汉诺塔求解问题
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64 ...
- 汉诺塔算法python_经典算法:汉诺塔
学编程,学IT,算法也是必不可缺的,这一次给大家带来一个经典的递归算法题,汉诺塔.算是算法的入门小题目之一吧~ 视频教程 什么是汉诺塔? 我这里直接拉来一个图解释一下(挂了请联系我) 就是这么一个东西 ...
- 算法笔记 —— 汉诺塔详解
文章目录 一.问题来源 二.小游戏体验 三.思路分析 四. 程序实现 一.问题来源 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号X.Y.Z),在 ...
- 题目---汉诺塔及AI代码及八皇后
2019春第十一周作业 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering ...
- 用java编写汉诺塔问题_数据结构与算法之汉诺塔问题(Java递归)
汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 要求:1)大的盘在下面,小的盘在上面 2)一次只能移动一个盘子 个人思路:先 ...
- 关于汉诺塔,C++代码,代码效果演算
1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- 【算法】汉诺塔 移动
文章目录 1.概述 本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 1.概述 汉诺塔的移动参考其他文章. 算法如下 public class Hanoi ...
最新文章
- 费马定理中值定理_数论-欧拉函数、欧拉定理
- C语言--字符串和数字的相互转换
- 这部日本「神作」彻底拉低了我入门AI的门槛
- android aapt 用法 -- ApkReader
- Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)
- php到岗第一天都做什么,十天学会php之第一天
- error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
- 如何登录新浪微博html5,新浪微博怎么登陆
- 简单无须Root 谷歌相机Gcam 打开即闪退的解决方法
- HTML指南针源码zip,指南针指标公式源码
- TP50 TP90 TP95 TP99 TP999 TP9999
- 【PCB专题】PCB 阻焊层(solder mask)与助焊层(paste mask)有什么区别
- vscode_历史版本下载_便携版/安装版
- axios获取html页面,axios 获取后台数据
- CNN,GAN,AE和VAE概述
- Vue学习--子组件向父组件传值
- SVG矢量图怎么做?
- Java设计模式:访问者模式,同一数据对象,不同访问者索取目的不同
- flexbox的学习,display:flex display:box 淘宝触屏版、饿了么网布局分析分析
- _environ与ssp攻击