分治算法(以汉诺塔讲解为例)

本文介绍分治算法的基本思想,并通过汉诺塔问题详细阐述其应用过程。汉诺塔是一个经典的递归问题,利用分治策略可以简洁地解决。文章提供了完整的代码实现及运行结果。

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

何为分治算法?
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。(这里我要说明一点分治算法和二分查找的一个区别,分治算法分解的子问题和原问题是有联系的,即求出子问题的解后,就可得到原文题的解;而二分查找不断的分解,所分解的子模块和整个大模块没有关联,当采用二分查找算法查找序列的关键字时,假设要查找的数小于mid,我们就直接放弃右半部分的序列,接着往左半部分找)

好了,言归正传,我主要写一下汉诺塔的一个思路分析:
(1)如果只有一个盘,毫无疑问A->C
(2)如果有n>=2个盘的情况,我们可以将这些盘看作两个部分,一部分是最底下的一个盘(称作下半部分盘),另一部分是除了底下的那个盘外的上边所有的盘(称作上半部分盘):
1.
先把上半部分的盘A->B
2.
再把下部分的盘A->C
3.
把B塔上所有的上半部分的盘再从B->C

话不多说,直接放代码,

package Algorithm;

//分治算法的典型应用-汉诺塔问题
public class Hanoitower {

	public static void main(String[] args) {
		hanoiTower(5, 'A', 'B', 'C');
		
	}
	//使用分治算法移动汉诺塔
	public static void hanoiTower(int num,char a,char b,char c){
		//只有一个盘,直接从A->C
		if (num == 1) {
			System.out.println("第1个盘从" + a + "->" + c);
		}else {
			//如果有n>=2个盘的情况,我们可以将这些盘看作两个部分,一部分是最底下的一个盘,另一部分是除了底下的那个盘外的上边所有的盘:
			//1,先把上半部分的所有盘从A->B,移动过程借用C塔
			hanoiTower(num-1, a, c, b);
			//2,再把底下的那个盘直接从A->C,相当于只有一个盘时,直接从A->C
			System.out.println("第" + num + "个盘从" + a + "->" + c);
			//3,再把B盘上所有的从A上移到的上半部分所有盘从B->C,移动过程中会借用到A塔
			hanoiTower(num-1, b, a, c);
		}
	}
}

代码不长,注释也很详细,主要是理解汉诺塔的题解思路,再贴一下结果图吧:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值