Java递归基础案例-汉诺塔

简介: Java递归基础案例-汉诺塔

汉诺塔问题

/**

* Title: 汉诺塔问题

* Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。

* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。

*/


image.png

1,当只有一个的时候

image.png



从A 移动盘子1 号到C


2,当只有2个的时候

image.png

image.png


从A 移动盘子1 号到B

从A 移动盘子2 号到C

从B 移动盘子1 号到C


3,当只有3个的时候

image.png


从A 移动盘子1 号到C

从A 移动盘子2 号到B

从C 移动盘子1 号到B

从A 移动盘子3 号到C

从B 移动盘子1 号到A

从B 移动盘子2 号到C

从A 移动盘子1 号到C


4,当只有4个的时候


image.png


从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


按照规律编写代码:


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); // 递归调用,缩小问题的规模
  }
  }
}


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


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


相关文章
|
23天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
59 3
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
73 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
25天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
48 2
|
26天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
15 2
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
2月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
52 15
|
2月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
37 5
|
3月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
32 1
java基础(11)函数重载以及函数递归求和
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
45 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
下一篇
无影云桌面