递归实例--汉诺塔问题
发布日期:2021-11-02 12:35:11 浏览次数:3 分类:技术文章

本文共 1226 字,大约阅读时间需要 4 分钟。

汉诺塔详情请参考:

汉诺塔规则
有n个盘子,从第一个柱子,移动到第三个柱子。要求每个盘子从柱子上到柱子下,序号是从小到大。
假设三个柱子:A,B,C
我们要求将所有盘子 从A移动C
分析:
当盘子是一个的时候,直接将盘子从A移动到C

当是两个盘子的时候,我们将上方盘子标记为序号1,下面个盘子为序号2.

(1)我们将1移动到B,(上方的盘子从A移动到中间位置)
(2)2移动到C, (将最后一个盘子从A移动到C)
(3)最后将1从中间位置B移动到C。(将上方的盘子,从中间移动到第三位置)

当时三个盘子的时候,我们一次从上到下给盘子标号1,2,3.

(1)我们将1移动到C,将2移动到B,再将1从C移动到B,(到这里我们将上方两个盘子作为一个整体,并且将它整体移动到了中间位置)
(2)将3从A移动到C,
(3)将1从B移动到A,将2从B移动到C,将1从A移动到C(这一步是将上方两个盘子整体从中间位置移动到第三位置)

推论:无论多少个我们都将其视为两个盘子,将上方的n-1个盘子视为整体,最后一个盘子视为一个整体。

我们只需要完成三步骤:
1.将上方n-1个盘子从第一位置移动到中间位置
2.将最后一个盘子n从第一位置移动到最后
3.将上方的n-1个盘子从中间位置移动到第三位置

代码实现:

public class Hanoi{
public static void main(String[] args){
hanoi(3,'A','B','C'); } /** * * @param n 柱子数量 * @param init 第一个柱子 * @param middle 中间柱子 * @param desti 目标柱子 */ public static void hanoi(int n,char init,char middle,char desti){
if(n==1){
System.out.println("第1个盘子从"+init+"--->"+desti); }// else{
//移动上面的所有盘子借助(第三个柱子)从第一个柱子移动到中间柱子 hanoi(n-1,init,desti,middle); //移动第n个,从第一个位置移动到第三个柱子 System.out.println("第"+n+"个盘子从"+init+"--->"+desti); //将上面所有盘子从中间柱子移动到第三个位置 hanoi(n-1,middle,init,desti); } }}

转载地址:https://blog.csdn.net/weixin_43919632/article/details/90652312 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:排序算法之快速排序
下一篇:排序算法之冒泡排序

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月19日 12时54分23秒