汉诺塔问题

简介: 汉诺塔问题   最近面试题遇到过汉诺塔的问题,当时竟然懵逼了,不会了!!大学研究的问题竟然都忘光了,于是抓紧捡起来。然而在网上看了看博客,发现非递归算法还真挺多。下面总结了一下。   一、递归算法   1、递归算法优缺点:递归算法算是最易于理解也是最容易实现的,但是对内存的消耗也是巨大的,因为递归需要系统堆栈来保存调用函数地址、形参、局部变量、返回值等数据,也就是回调N次,就要保存N个之前提到的数据。

汉诺塔问题

  最近面试题遇到过汉诺塔的问题,当时竟然懵逼了,不会了!!大学研究的问题竟然都忘光了,于是抓紧捡起来。然而在网上看了看博客,发现非递归算法还真挺多。下面总结了一下。

  一、递归算法

  1、递归算法优缺点:递归算法算是最易于理解也是最容易实现的,但是对内存的消耗也是巨大的,因为递归需要系统堆栈来保存调用函数地址、形参、局部变量、返回值等数据,也就是回调N次,就要保存N个之前提到的数据。但是递归算法结构简洁,清晰。基于这个原因,我先介绍一下递归算法。

  2、递归算法思路:

    1)将N-1个盘子从A柱移动到B柱或者将N-1个盘子从B柱移动到A柱。

    2)将第N个盘子移动到C柱。

代码:

 1 /**
 2      * 
 3      * @param n 需要移动的盘子数
 4      * @param a a柱    这里的abc柱,并不是实际问题中的ABC三个柱子,是动态分析过程中的柱子
 5      * @param b    b柱
 6      * @param c    c柱
 7      */
 8     static void move(int n, char a, char b, char c) {
 9         if (n == 1)
10             System.out.println(a + "-->" + c); // 当只有1个盘子的时候直接将盘子从a柱移动到c柱
11         else {
12             move(n - 1, a, c, b); // 将当前a柱的n-1个盘子,通过c移动到b
13             System.out.println(a + "-->" + c);//将a柱子上的最大的盘子移动到c柱
14             move(n - 1, b, a, c); // n-1个移动过来之后b柱成为a柱,这里就变成了n-1个盘子从b移动到c柱。
15         }
16     }

  二、非递归算法

  这里使用了便利二叉树的思路

  1)算法推论描述:

    这里用4个盘子举例

    进行整合:

  

  2)算法规律:

 

   根据上面的二叉树的图,可以看到如下规率:

 

    A.盘子数(N=二叉树的高度(H

 

    B.第n层序号能被2的(n-1)次方整除,但不能被2的n次方整除(n从下至上增加)

 

    C.每一层的节点数=2的(N-n)次方

 

    D.无论有多少个盘子,每一层的步骤都是相同的,例如:所有的最上面一层都是A->C,第二层也是一样的。

 

    E.每一层都是以A未开始,以C为结束

 

    F.奇数层规律是A->C,C->B,B->A,依次循环

 

    G.偶数层规律是A->B,B->C,C->A,依次循环

 

 

 

  根据上面的特点进行进一步总结得到:

 

    A.第M部层数确定(可以判断循环规律):如果M能被2的(n-1)次方整除,但不能被2的n次方整除,那么,M步处于n

 

    B.第M步在J层的序号确定:K=M除以2的(n-1)次方

 

  3)算法代码:

 

static void hanoi(int m) {
        int c = 1;// 总步骤数
        int n = 1;// 步骤数
        c <<= m;
        for (; n < c; n++) {
            shuchu(m, n);
        }
    }

    private static void shuchu(int m, int n) {
        for (int i = n, y = i % 2, c = m;; i = i / 2, y = i % 2, c--) {
            if (y != 0) {
                switch ((c % 2) * 3 + (i / 2) % 3) {
                case 0:
                    System.out.println("第"+n+"步"+ ":A-B"+"   当前移动的盘子是:"+(m-c+1));
                    break;
                case 1:
                    System.out.println("第"+n+"步"+ ":B-C"+"   当前移动的盘子是:"+(m-c+1));
                    break;
                case 2:
                    System.out.println("第"+n+"步"+ ":C-A"+"   当前移动的盘子是:"+(m-c+1));
                    break;
                case 3:
                    System.out.println("第"+n+"步"+ ":A-C"+"   当前移动的盘子是:"+(m-c+1));
                    break;
                case 4:
                    System.out.println("第"+n+"步"+ ":C-B"+"   当前移动的盘子是:"+(m-c+1));
                    break;
                case 5:
                    System.out.println("第"+n+"步"+ ":B-A"+"   当前移动的盘子是:"+(m-c+1));
                }
                break;
            }
        }
    }

 

相关文章
|
消息中间件 缓存 测试技术
企业微信针对百万级组织架构的客户端性能优化实践
本文主要分享的是企业微信在百对百万级大规模组织架构(后文简称大架构)时,是如何对客户端进行性能优化过程的,希望带给你启发。
298 0
|
机器学习/深度学习 vr&ar
【深度强化学习】值函数逼近的详解(图文解释)
【深度强化学习】值函数逼近的详解(图文解释)
327 0
|
开发工具
Python----使用schedule模块可以非常简单地设置定时任务
Python----使用schedule模块可以非常简单地设置定时任务
1824 0
|
搜索推荐 UED
敏感词 v0.19.0 新特性之敏感词单个编辑,不必重复初始化
【9月更文挑战第17天】敏感词管理在众多场景中至关重要。敏感词 v0.19.0 推出的新特性——单个编辑,无需重复初始化,显著提升了效率和灵活性,降低了系统负担。用户可直接修改特定敏感词,适用于内容审核平台、社交网络及电商平台等多种场景,确保及时响应变化,提升用户体验。这一特性为敏感词管理带来了重大改进,具有广泛的实用价值。
277 3
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
347 2
|
存储 缓存 人工智能
Ascend上的FlashAttention实现
FlashAttention是优化Transformer模型计算效率和内存使用的技术,通过减少存储访问开销提升性能。它采用Tiling、Recomputation、分块SoftMax等策略,减少HBM访问,加速计算,并在昇腾AI处理器上实现了显著的性能提升。
|
Java Maven 开发工具
如何发布Android Library到maven私有仓库
在我们的项目架构中,一定存在一些基础的模块,这些模块可以在多个app上通用,这种情况我们一般会将这些模块封装成Android Library统一维护,并上传到仓库方便其他小组使用。仓库可以选择如mavenCentral这类公开的仓库,但是我们一般选择搭建自己的maven私有仓库,比如:Sonatype Nexus。本文就一步步的教大家如何将Android Library发布到maven私有仓库。
703 0
|
Shell
monkey命令
​ 一:Monkey所有命令: monkey常用命令: 二、Monkey常用命令参数说明 基本参数 说明 -p 指定一个或多个包 -s 指定一个随机数生成器的seed值 --throttle 指定事件之间的固定延迟(ms) -v 指定反馈信息级别(信息级别就是日志的详细程度) -c 指定一个或多个类别名 -f 运行指定的monkey脚本 事件参数 说明 --pct-touch 指定触摸事件百分比 --pct-motion 指定动作事件百分比 --pct-trackball 指定轨迹事件百分比 --pct-syskeys 指定系统按键事件百分比
363 0
|
文字识别 监控 机器人
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
554 0
|
负载均衡 前端开发 应用服务中间件
nginx部署前后端分离项目(二)
nginx部署前后端分离项目(二)
683 1