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

目录

例题简介

解题思路

代码


例题简介

汉诺塔问题是一个经典的问题。汉诺塔(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');
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值