分治算法
介绍
1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并
2.应用:二分搜索、大整数乘法、棋盘覆盖、归并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔、快速傅立叶变换
步骤
1.分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题
2.解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
3.合并:将各个子问题的解合并为原问题的解
分治算法解决汉诺塔问题
public class HanoiTower {
static int times;//记录移动次数
/**
* 移动盘子
*
* @param n:盘的个数
* @param a:所有盘的起点
* @param c:所有盘的终点
*/
public static void move(int n, char a, char c) {
System.out.println("第" + (++times) + "次移动" + "第" + n + "个盘从" + a + "->" + c);
}
//分治算法递归
public static void hanoiTower(int n, char a, char b, char c) {
if (n == 1) {//只有一个盘
move(n, a, c);
} else {//多个盘,分割为两部分,最底层一个盘,上面所有盘视作整体
//n-1个盘从A移到B,以C作过渡
hanoiTower(n - 1, a, c, b);
//第n个盘从A移到C
move(n, a, c);
//n-1个盘从B移到C,以A作过渡
hanoiTower(n - 1, b, a, c);
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战