算法:递归启蒙-汉诺塔

news2024/10/6 1:38:56

基本所有的讲递归的书和视频都会以汉诺塔作为开始,因为它足够经典

汉诺塔问题要求整个挪动的过程中都符合小压大的原则,就是如果同一个柱子上有超过1个的话,那必须下面是最大的,上面依次变小,不能出现大盘压小盘的情况。

n层汉诺塔问题解题思路

1.先把n-1个盘从左挪到中

2.把第n个盘从左挪到右

3.把1~n-1从中挪到右。

3层汉诺塔的具体步骤

 粗糙版代码:
 

package dataStructure.recurrence.practice;

public class Hanoi {
    public static void leftToRight(int n) {
        if(n == 1) {
            System.out.println("move 1 from left To Right");
            return;
        }
        leftToMiddle(n-1);
        System.out.println("move " + n + " from left to right");
        middleToRight(n - 1 );
    }

    public static void leftToMiddle(int n) {
        if(n == 1) {
            System.out.println("move 1 from left to middle");
            return;
        }
        leftToRight(n - 1);
        System.out.println("move " + n + " from left to middle");
        rightToMiddle(n - 1);

    }

    public static void middleToLeft(int n) {
        if(n == 1) {
            System.out.println("move 1 from middle to left");
            return;
        }
        middleToRight(n - 1);
        System.out.println("move " + n + " from middle to left");
        rightToLeft(n - 1);
    }

    public static void middleToRight(int n) {
        if(n == 1) {
            System.out.println("move 1 from middle to right");
            return;
        }
        middleToLeft(n -1 );
        System.out.println("move " + n + " from middle to right");
        leftToRight(n - 1);
    }

    public static void rightToLeft(int n) {
        if(n == 1) {
            System.out.println("move 1 from right to left");
            return;
        }
        rightToMiddle(n - 1 );
        System.out.println("move " + n + " from right to left");
        middleToLeft(n - 1);
    }

    public static void rightToMiddle(int n) {
        if(n == 1) {
            System.out.println("move 1 from right to middle");
            return;
        }
        rightToLeft(n - 1);
        System.out.println("move " + n + " from right to middle");
        leftToMiddle(n - 1);
    }

    public static void main(String[] args) {
        leftToRight(3);
    }
}

代码中枚举了6种可能性的移动,每个都写了一个方法,显然有些臃肿,我们可以通过增加参数来让方法拥有更多的功能。

改进后的正常版的汉诺塔代码

package dataStructure.recurrence.practice;

public class Hanoi2 {
    public static void move(int n, String from, String to, String other) {
        if(n == 1) {
            System.out.println("move 1 from " + from + " to " + to  );
        } else {
            move(n - 1, from, other, to);
            System.out.println("move " + n + " from " + from + " to " + to);
            move(n - 1, other, to, from);
        }
    }

    public static void main(String[] args) {
        move(3, "left", "right", "middle");
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Element Plus的Pagination 组件用法

5.2 Pagination 组件 分页组件通常与表格组件一同使用,在数据量很大的时候,通常不会在表格中一次性显示所有的数据,因为如果所有数据都展示在一个页面,数据量庞大,容易造成浏览器崩溃,就算数据可以完全展…

【CV2NLP】Chinese-Vicuna 中文小羊驼

学习一个短语! gain proficiency in 熟练掌握 (用我最爱的文心一言造个句子) 最近羊驼家族百花齐放,赶紧学习一下 ChatBot 的背后细节。Chinese-Vicuna 中文小羊驼是基于 Vicuna 模型使用中文数据 LORA 方案来微调的一种中文对…

数值分析-牛顿-柯特斯公式的概念、推导与应用

目录 一、引言 二、牛顿-柯特斯公式的基本概念 三、牛顿-柯特斯公式的推导 四、牛顿-柯特斯公式的应用 五、牛顿-柯特斯公式的优缺点 六、总结 一、引言 数值分析是数学中的一个重要分支,它研究如何利用数值方法来解决实际问题。在数值分析中,牛顿…

Redux 学习系列(一) —— 基础概念入门篇

简介 Redux 是一个可预测的 JavaScript 应用状态管理容器,也可以说是一个应用数据流框架。 作用 Redux 主要是用作应用状态的管理。它抽离所有组件的状态,构造一个中心化的单独常量状态树(对象)来保存这一整个应用的状态。这棵…

Java经典笔试题—day02

Java经典笔试题—day02 🔎选择题🔎编程题🥝排序子序列🥝倒置字符串 🔎结尾 🔎选择题 (1)A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明: A a0new A(…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

【数据库】面试高频问题汇总及详细解答

【C语言部分】面试高频问题汇总及详细解答 【操作系统(Linux)】面试高频问题汇总及详细解答 【计算机网络】面试高频问题汇总及详细解答 本文目录 1. SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的1.4 说一说你对外连接的了解1.5 说说SQL中怎么…

VM虚拟机安装Ubuntu server 22.04网络问题

在使用vm虚拟机安装ubuntu server 22.04的时候会遇到一些网络问题,例如虚拟机内的Ubuntu不能上网,ping www.baidu.com不通,主机使用远程工具不能建立远程连接,Ubuntu ping本地主机不通,本地主机ping虚拟机也不通的问题…

vue3+vite项目优化。

最近开发的一个vue3vitets项目,build后发现体积过大,所以针对于项目体积进行一次优化。 一: 使用rollup-plugin-visualizer 可视化分析包 npm i rollup-plugin-visualizer -S 在vite.config.js中引入 在 plugins里面 然后执行npm run build就自动打开…

最新开源Chatgpt人工智能对话源码系统如何搭建?含详细安装教程分享和源码

人工智能对话系统市场需求正在不断增长。随着人们对智能化、自动化服务的需求不断提高,人工智能对话系统成为越来越多企业和组织的首选解决方案,可以有效提升用户体验、降低成本、提高效率。 一、Chatgpt人工智能对话源码系统定义 ChatGPT是一种基于深…

流量挂机赚钱项目Traffmonetizer

利用闲置电脑/服务器/安卓手机/树莓派来赚点电费 简介 Traffmonetizer是一个来自欧洲的流量挂机平台,类似Peer2profit,满10刀可提现(Paypal、BTC、Payoneer),注册好像就送5刀,Traffmonetizer不怎么占用CPU和内存以及流量&#x…

初学容器化

1.docker build,ship,run,any app anywhere docker类似运输中的集装箱,可以装任何应用(镜像文件),运行到各种服务器上。 docker提供的是进程上的隔离,虚拟机提供的是操作系统资源…

【五一创作】嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

目录 前言 基本介绍 Sqlite 对比 MySQL 字段类型 语法 创建表 插入数据 更新数据 查询数据 删除数据 查看建表语句 Sqlite-JDBC 嵌入到Java程序 前言 最近在用JavaFX做一个桌面软件需要用到数据库,但MySQL这种数据库明显只能本地访问,把软…

JVM-0502

垃圾回收 概述 内存的自动分配 垃圾收集,不是J8Va语音的件生产物。早在1968年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题: 哪些内存需要回收?什么时候回收?(…

双金属复合圆管层间高温接触热阻测试方法的分析和选择

摘要:双金属复合圆管因其优越的特性在越来越多的领域得到广泛应用,而其层间接触热阻是这种圆管作为换热管时的重要性能指标。本文针对这种双金属复合圆管层间接触热阻的测试需求,分析和对比了现有用于接触热阻测试的各种稳态和瞬态方法&#…

网络应用基础 ——(2023新星计划文章一)

一,网络的概念 1.1网络及其带来的好处 (1)计算机网络是指通过通信设备和通信线路将多台计算机连接起来,以便实现资源共享、信息传递和协同工作的技术和系统。计算机网络是现代信息技术的重要组成部分,已经深入到我们…

代码随想录算法训练营第三十一天 | 贪心1,想不到怎么找局部最优就做不出来

贪心算法理论基础 代码随想录 (programmercarl.com) 贪心算法理论基础!_哔哩哔哩_bilibili 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额&#xff…

代码随想录刷题笔记3

文章目录 回溯细节模板题型组合分割子集排列棋盘问题N皇后问题解数独问题 其他 总结 回溯 本质上:穷举 剪枝。回溯法就是解决这种k层for循环嵌套的问题。 for循环横向遍历,递归纵向遍历,回溯不断调整结果集。 注意画出 解空间树-N叉树。 细…

无云服务器,Linux本地快速搭建web网站,并内网穿透发布上线(1)

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 转载自cpolar文章:Linux CentOS本地搭建…

【QT】 Qt高级——Qt自定义标题栏

【QT】 Qt高级——Qt自定义标题栏 一、Qt自定义标题栏简介 QWidget及其子类窗体组件的标题栏受操作系统的控制,即标题栏的界面风格与操作系统的主题风格相同,工程实践中需要开发者自行定义,达到美化应用程序界面的目的。 二、Qt自定义标题…