前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java递归基础案例-汉诺塔

Java递归基础案例-汉诺塔

作者头像
红目香薰
发布2022-11-29 20:00:14
3470
发布2022-11-29 20:00:14
举报
文章被收录于专栏:CSDNToQQCode

汉诺塔问题 /** * Title: 汉诺塔问题 * Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。 * 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。 */

1,当只有一个的时候

从A 移动盘子1 号到C

2,当只有2个的时候

从A 移动盘子1 号到B 从A 移动盘子2 号到C 从B 移动盘子1 号到C

3,当只有3个的时候

从A 移动盘子1 号到C 从A 移动盘子2 号到B 从C 移动盘子1 号到B 从A 移动盘子3 号到C 从B 移动盘子1 号到A 从B 移动盘子2 号到C 从A 移动盘子1 号到C

4,当只有4个的时候

 从A 移动盘子1 号到B 从A 移动盘子2 号到C 从B 移动盘子1 号到C 从A 移动盘子3 号到B 从C 移动盘子1 号到A 从C 移动盘子2 号到B 从A 移动盘子1 号到B 从A 移动盘子4 号到C 从B 移动盘子1 号到C 从B 移动盘子2 号到A 从C 移动盘子1 号到A 从B 移动盘子3 号到C 从A 移动盘子1 号到B 从A 移动盘子2 号到C 从B 移动盘子1 号到C

按照规律编写代码:

代码语言:javascript
复制
package Action;

public class test {
	public static void main(String[] args) {
		int nDisks = 4;//盘子别直接写64,计算量太大
		moveDish(nDisks, 'A', 'B', 'C'); 
	}

	/**
	 * @description 在程序中,我们把最上面的盘子称为第一个盘子,把最下面的盘子称为第N个盘子
	 * @param level:盘子的个数
	 * @param from        盘子的初始地址
	 * @param inter       转移盘子时用于中转
	 * @param to          盘子的目的地址
	 */
	public static void moveDish(int level, char from, char inter, char to) {

		if (level == 1) { // 递归终止条件
			System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
			return;
		} else {
			// 递归调用:将level-1个盘子从from移到inter(不是一次性移动,每次只能移动一个盘子,其中to用于周转)
			moveDish(level - 1, from, to, inter); // 递归调用,缩小问题的规模
			// 将第level个盘子从A座移到C座
			System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);
			// 递归调用:将level-1个盘子从inter移到to,from 用于周转
			moveDish(level - 1, inter, from, to); // 递归调用,缩小问题的规模
		}
	}
}

可以看到,里面的操作过程有一些类似全排列的操作,所以【全排列】是这个汉诺塔的基础哦。

希望能给大家带来一定的帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档