【递归】汉诺塔问题(Java版)

news2025/2/1 14:43:14

目录

1.题目解析

2.讲解算法原理

2.1.如何来解决汉诺塔问题?

2.2.为什么这道题可以用递归来做?

2.2.1 什么是递归

2.2.2 为什么会用到递归

3.如何编写递归代码?

4.递归的细节展开图


1.题目解析

汉诺塔问题链接

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

 输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]

示例2:

 输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]

2.讲解算法原理

2.1.如何来解决汉诺塔问题?

2.2.为什么这道题可以用递归来做?

2.2.1 什么是递归

函数自己调用自己的情况

2.2.2 为什么会用到递归
  • 在解决主问题的时候碰到相同的子问题

  • 在解决子问题的时候又碰到相同的主问题

大家发现我们的 第一个步骤和第三个步骤 全都是同样一类的问题解决 N=4 的方法和 N=3 的方法是一模一样 --> 先把除最大的盘子外的其他盘子转移到中间,后把最大盘子转到C

3.如何编写递归代码?

public class hanota {
    public void hanota(List<Integer> a, List<Integer> b, List<Integer> c) {
        
        dfs(a,b,c,a.size());
    }
    public void dfs(List<Integer> a, List<Integer> b, List<Integer> c,int n){
        if (n == 1){
            // 把 a 柱子的最后一个盘子移动到c
            c.add(a.remove(a.size() - 1));
            return;
        }
        // 把 a 上的 n-1 个盘子移动到b上
        dfs(a,c,b,n-1);
        // 把 a 的最上面的那个盘子放到 c 上
        c.add(a.remove(a.size() - 1));
        // 把 b 上 n-1 个盘子通过 a 放到 c 上
        dfs(b,a,c,n-1);
    }
}

在这里我曾经想过:为什么c.add这里是 a.siez() - 1 而不是a[0]

后来才明白:a[指的永远是最大的那个盘子,而 a.siez() - 1 指的是a最上面哪一个盘子

不能指定最大的那个盘子,因为在后续遍历中传入dsf的a不一定就是原a了,如果一直加a[0]会出现很多错误!!

4.递归的细节展开图

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

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

相关文章

激活函数小结:ReLU、ELU、Swish、GELU等

文章目录 SigmoidTanhReLULeaky ReLUPReLUELUSoftPlus MaxoutMishSwishGELUSwiGLUGEGLU资源 激活函数是神经网络中的非线性函数&#xff0c;为了增强网络的表示能力和学习能力&#xff0c;激活函数有以下几点性质&#xff1a; 连续且可导&#xff08;允许少数点上不可导&#x…

halcon深度学习中的样本增强

一、问题描述 halcon的例程中&#xff0c;下面是最经典的语义分割例子。 但是&#xff0c;它并没做样本增强&#xff0c;因为 你看下图的代码&#xff0c;第90行&#xff0c;那两个参数都是[]&#xff0c;空的。 二、解决方案 如下图所示&#xff0c;增加了从95到108行&#…

启航kp OpenHarmony环境搭建

前提 启航kp OpenHarmony环境搭建 搭建好OpenHarmony环境 未搭建好可以参考OpenHarmony docker环境搭建 安装vscode 下载好启航kp所需的开发包和样例 下载地址 搭建过程 进入正确文件夹 首先要进入 /home/openharmony 目录下&#xff0c;如果没有打开在vsc左上角找到文…

DELL R710硬盘格式化方法备忘录

DELL R710硬盘格式化方法备忘录 本方法是全部格式化硬盘&#xff0c;不能格式化其中的某一块 开机出现带CTRLR字样后 按CTRLR 按下CTRLP三次 以上是目前硬盘的状态&#xff0c;使用中的是ONLINE状态&#xff0c; 按CTRLP&#xff0c;回到第一个界面&#xff0c;然后按F2 选择…

【线上Java项目部署Bug记录】天翼云80端口不能使用,即使暴露了也不行!!!

项目场景&#xff1a; 项目背景&#xff1a;使用Docker部署SpringBoot项目&#xff0c;前端是 Vue 项目是&#xff1a;https://gitee.com/JavaLionLi/RuoYi-Vue-Plus 服务器&#xff1a;天翼云服务器 端口&#xff1a; 问题描述 所有端口都开的好好的&#xff0c;docker的…

山西电力市场日前价格预测【2023-10-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-15&#xff09;山西电力市场全天平均日前电价为409.82元/MWh。其中&#xff0c;最高日前价格为722.95元/MWh&#xff0c;预计出现在19: 00。最低日前电价为255.87元/MWh&#xff0c;预计…

tkinter自定义组件:文件选择按钮和颜色选择按钮

文章目录 文件对话框按钮代码实现颜色对话框 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框Frame控件&#x1f48e;PanedWindow和notebook控件扫雷小游戏&#x1f48e;强行表白神器…

人工智能就业前景越来越严峻了,你还在坚持吗?

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 从最近最火的chatGpt来看&#xff0c;AI时长不但没有低迷下去&#xff0c;而且还越来越好了&#xff01;去年毕业的一个朋友&#xff0c;硕士毕业&#xff0c;目前在字节做机器学习工程师&…

【Spring框架】Spring监听器的简介和基本使用

目录 一、观察者模式 1.1 模型介绍 1.2 观察者模式Demo 1.2.1 观察者实体 1.2.2 主题实体 1.2.3 测试代码 二、Spring监听器的介绍 2.1 事件&#xff08;ApplicationEvent&#xff09; 2.1.1 Spring内置事件 2.1.2 Spring内置事件 2.2 事件监听器&#xff08;Applic…

阿里云安全中心需要购买吗?功能及价格告诉你值不值!

阿里云云安全中心有必要购买吗&#xff1f;云安全中心经常提示云服务器高危漏洞&#xff0c;需要购买云安全中心吗&#xff1f;无论是云服务器上是网站还是其他应用&#xff0c;难免会存在漏洞&#xff0c;有漏洞是一定要修复的&#xff0c;云安全中心不仅可以修复漏洞还可以防…

【C++STL基础入门】list的增、删

文章目录 前言一、list迭代器1.1 list迭代器的定义 二、list增2.1 头添加2.2 尾添加2.3 中间添加 三、list删3.1 尾删除3.2 头删除3.3 删除指定元素3.4 clear()函数3.5 remove()函数3.6 unique()函数 总结 前言 在C中&#xff0c;STL&#xff08;Standard Template Library&am…

ALBERT-更小更少但并不快

BERT模型的压缩大致可以分为&#xff1a;1. 参数剪枝&#xff1b;2. 知识蒸馏&#xff1b;3. 参数共享&#xff1b;4. 低秩分解。 其中&#xff0c;对于剪枝&#xff0c;比较简单&#xff0c;但是容易误操作降低精读&#xff1b; 对于知识蒸馏&#xff0c;之前我写个一系列的…

【完美世界】战王之殇特别篇定档,11月3日播,云曦受辱石昊杀红眼了

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析完美世界国漫资讯。 完美世界第132集已经播出了&#xff0c;相信很多人都去看了。但是不知道大家注意到这一集的片尾没有。如果没有快进或者直接跳过的话&#xff0c;那么应该知道&#xff0c;官方给大家送惊喜了。 这个…

高校教务系统登录页面JS分析——四川大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

进程同步互斥问题

互斥-临界区前后分别PV操作&#xff1b;同步-前V后P 一、生产者费者问题 1.过程&#xff1a; 生产者生产产品——>缓冲区(供两者共享使用)——>消费者取出产品使用&#xff1b;但缓冲区有容量要求&#xff0c;会导致等待与唤醒。缓冲区是临界资源&#xff0c;各进程必…

Jetpack:007-各种各样的Button

文章目录 1. 概念介绍2. 使用方法2.1 Button2.2 IconButton2.3 ElevatedButton2.4 OutlinedButton2.5 TextButton2.6 FloatingActionButton 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中输入框相关的内容&#xff0c;本章回中将要介绍 Button。闲话休提&#xff0…

Linux系统编程02

makefile的原理 问题需求 之前我们讲过C语言代码主要是经过编译和链接两个步骤生成目标文件&#xff0c;但是在编译的时候我们可能需要进行多条指令的输入&#xff0c;要对main函数所在的文件进行汇编&#xff0c;再将我们定义的函数文件进行汇编&#xff0c;分别形成*.o文件&a…

网课、会议投屏自动截屏软件推荐 —— 使用定时自动截屏软件,自动截屏网课、会议投屏,方便回顾、整理

在当前的远程学习和工作环境下&#xff0c;我们经常需要参加网课和会议&#xff0c;而这些内容通常都是通过投屏的方式呈现给我们的。为了更好地记录和回顾这些内容&#xff0c;我们可以使用定时截屏软件来保存这些投屏截屏。 定时截屏软件功能 定时截屏软件可以帮助我们定时…

ModSecurity开源WAF防火墙和控制面板安装教程

ModSecurity开源WAF防火墙和控制面板安装教程 CyberPanel带有两个版本&#xff0c;一个是CyberPanel&#xff0c;另一个是CyberPanel Ent。CyberPanel附带OpenLiteSpeed&#xff0c;不限数量域名完全免费。CyberPanel Ent附带LiteSpeed Web Server Enterprise&#xff0c;只免…

2023年中国门把手产量、销量及市场规模分析[图]

门把手行业是指专门从事门把手的设计、制造、销售和安装等相关业务的行业。门把手是门窗装饰硬件的一种&#xff0c;用于开启和关闭门窗&#xff0c;同时也具有装饰和美化门窗的作用。 门把手行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着消…