数据结构与算法_递归_汉诺塔

本文详细解析了经典的汉诺塔问题,通过实例分析介绍了汉诺塔的解题思路,阐述了如何利用递归方法解决该问题,并提供了具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

例题简介

解题思路

代码


例题简介

汉诺塔问题是一个经典的问题。汉诺塔(Tower of Hanoi),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

如果不太明白 可以去这个网址玩玩游戏

http://www.4399.com/flash/109504_1.htm

 

解题思路

1. 先引用实例分析

引入三个名词:原始柱:即提供盘子的柱子;

                         目的柱:即要接收盘子的柱子;

                         辅助柱:即需要帮助完成该过程的柱子。

假设只有1个盘,则需要做的就是直接 A->C 即将原始柱移入目标柱

再者,假设2个盘,则操作是 A->B, A->C,B->C 这种情况下,我们要想把A中的所有盘移到C盘,需要借助B盘,我们称B盘为辅助柱。

继续,假设3个盘,这时候我们分三部步看。第一步:将A盘的前两个盘移给B盘,这个方法就跟我们上一个是一样了,A为原始柱,B为目的柱,C为辅助柱。第二步:将A盘的最后一个盘移给C盘。第三步:将B盘的两个盘移给C盘,这时候,我们以A为辅助柱,B为原始柱,C为目的柱。

2.带N分析

即我们假设A中盘的个数为N

那么此刻,即最初的时候,我们以A为原始柱,B为辅助柱,C为目的柱

好 那么这里,有没有想问 我们要辅助柱是用来干嘛呢??

我们将A中的N个盘全部移到C中,是不是要先将A中最大的盘移给C,所以,我们希望辅助盘B能够先承载(N-1)个盘

通过这个讲解,你是不是已经发现循环了。

接上面的步骤,我们要把A中的(N-1)个盘移给B,此时我们需要C作为辅助盘。你再试着推推,不就是一直循环了吗。

3.递归方法

递归有两个很重要的基本概念,即,基本情形递归情形。

基本情形: 简单来说,就是我们这个递归,这个很大循环的一个出口。

递归情形:就是我们重复调用该递归函数的情况。

根据上面的分析,我们有个循环体,就是原始柱上的所有盘移给目的柱。

我们这一题的出口是,当原始柱只剩一个盘的时候,我们要做最后一步,将原始柱上的盘子移给目的柱,然后退出就好了。

要是原始柱不只剩一个盘,那么我们需要做三步,即两次调用:

  第一步:将原始柱上的(N-1)个盘移给辅助柱。

  第二步:将原始柱上的第N个盘(即最后一个)移给目的盘,这种情况也就是我们上面所说的基本情形,也就是出口了。

  第三步:将辅助柱上的(N-1)个盘移给目的盘。

 

代码

/*
 * 递归算法 典型例题 
 * 汉诺塔 
 * 通过对题目的掌握,可知 每个塔可作为三种角色 即 目的塔、辅助塔、原塔
 * 
 */
public class TowersOfHanoi {
	static int time = 0;
	public static void function(int n, char source, char assistant, char target) {
		//若只剩下一个,直接移给 目的塔 就完成了 
		//此为该递归的出口  即基本情形
		if(n == 1) {
			time++;
			System.out.println("Time:\t" + time +"\t" +"Move " + source + " to " + target);
			return;
		}
		//此为递归情形
		else {
			//若不是剩下最后一个,我们要想将前面的(n-1)移给 辅助塔 
			function(n-1, source, target, assistant);//
			time++;
			System.out.println("Time:\t" + time +"\t" +"Move " + source + " to " + target);
			//然后将辅助(n-1)个移给 目标塔
			function(n-1, assistant, source, target);
		}
	}
	public static void main(String[] args) {
		function(8, 'A', 'B', 'C');
	}
}

 

内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值