递归求解汉诺塔问题(超详解)

news2024/11/15 7:37:50

问题提出

这个问题是关于三根柱子和一些圆盘的游戏。 初始时,所有的圆盘按照从大到小的顺序叠放在一根柱子上,目标是将所有圆盘从起始柱子移动到目标柱子上,在移动过程中,要满足以下规则喵:

  1. 每次只能移动一个圆盘。
  2. 大圆盘不能放在小圆盘上。
  3. 只能通过中间柱子作为辅助,将圆盘从起始柱子移到目标柱子上。

这个问题看似简单,但实际上涉及到了递归的思想 💡

让我们来看一个例子: 假设有3个圆盘(编号分别为1、2、3),初始时它们叠放在柱子A上,目标是将它们移动到柱子C上 这时,我们可以按照以下步骤进行:

  1. 将编号为1的圆盘从柱子A移动到柱子C(起始柱子->目标柱子)。
  2. 将编号为2的圆盘从柱子A移动到柱子B(起始柱子->辅助柱子)。
  3. 将编号为1的圆盘从柱子C移动到柱子B(目标柱子->辅助柱子)。
  4. 将编号为3的圆盘从柱子A移动到柱子C(起始柱子->目标柱子)。
  5. 将编号为1的圆盘从柱子B移动到柱子A(辅助柱子->起始柱子)。
  6. 将编号为2的圆盘从柱子B移动到柱子C(辅助柱子->目标柱子)。
  7. 将编号为1的圆盘从柱子A移动到柱子C(起始柱子->目标柱子)。

通过上述步骤,我们成功地将所有圆盘从柱子A移动到了柱子C上 🌟

问题分析

这个问题看似简单,但是递归解法的精妙之处在于,它可以处理任意数量的圆盘,而不需要为每个数量都编写不同的代码 😺

那么应该怎样分析圆盘的移动过程呢?

这就要用到递归以大化小的特点了:

原理:要解决n层的汉诺塔,必须先解决n-1层的汉诺塔...解决1层汉诺塔

假设有n个圆盘,将它们从柱子A移动到柱子C,可以按照以下方法进行喵:

  1. 如果n为1,直接将编号为1的圆盘从柱子A移动到柱子C,完成(递归终止条件)

  2. 否则,按照以下步骤进行:

    a. 将n-1个圆盘从柱子A移动到柱子B,作为辅助(递归调用)

    b. 将编号为n的圆盘从柱子A移动到柱子C,完成(这是最大的圆盘,直接从起始柱子移动到目标柱子)

    c. 将之前移动到柱子B的n-1个圆盘,从柱子B移动到柱子C,作为辅助(递归调用)

这样,我们就可以递归地将所有圆盘从起始柱子A移动到目标柱子C上 🌟

1.

 2.

3. 

问题解决 

来看一下代码:

import java.util.Scanner;

//汉诺塔问题复习
public class test1 {

    public static void hannuota(int n, String a, String b, String c) {
        //最后一次将1模块这样移动
        if (n == 1) {
            System.out.println("将1模块从" + a + "移至" + c + "处");
        } else {
            //将第1至n-1模块从A塔移至工具塔(B塔)
            hannuota(n - 1, a, c, b);
            //1至n-1挪动完后,将第n个模块从A塔移至“C塔”
            System.out.println("将" + n + "模块从" + a + "移至" + c + "处");
            //将第n个模块移动完后将剩下的n-1个模块从B塔移动至C塔
            hannuota(n - 1, b, a, c);
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //输入要处理的模块数
        int n = sc.nextInt();
        //假设初始所有模块在A塔,要移动至C塔
        hannuota(n, "A塔", "B塔", "C塔");
        //计算汉诺塔最少移动次数
        double ret = Math.pow(2, n) - 1;
        System.out.println("至少要移动" + ret + "次");
    }
}

 好了汉诺塔问题就说到这里,大家下期再见啊😊🌈

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

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

相关文章

混动才是未来?福特电车亏损数十亿美元,聚焦混动展望未来

福特汽车公司决定聚焦混合动力汽车,以弥补电动汽车市场亏损数十亿美元。吉姆法利首席执行官表示,在最新财报发布会上透露,未来将推出更多种类的混合动力车型。 福特最近公布了Q2盈亏情况,显示电动汽车部门的亏损有所增加。不过&am…

从源码角度配合网络编程函数accept() connect()等实现的客户端服务器通信 分析下 三握手四挥手都做了什么

首先我们先说下网络编程API: 数据在网络上通信,通信的双方一个是 客户端, 一个是 服务器 更具体来说,不是 客户端和服务器这两个机器在 经由互联网 进行通信, 而是 客户端上的某一进程 与 服务器端的某一进程 进…

vue3+ts未使用变量报错的解决

实例 问题原因 tsconfig.json文件中开启了ts语法检查 "strict": true, // 开启严格模式,检查类型声明和赋值...是否合法 "noUnusedLocals": true, // 检查是否存在未使用的变量 "noUnusedParameters": true, // 检查是否存在会使…

app性能测试怎么做?内容全在这里了

1 app性能测试 提到APP的性能测试这个概念比较笼统,因为APP的性能测试分为服务端的性能和手机端的性能测试 1.1 app服务端性能测试 app服务端的性能测试,利用jmeter等工具模拟并发,压测服务器系统,服务端性能测试,一…

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版(2023) 前言:彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源(后续安装第三方库可以加快速度)超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

2023.07.29 驱动开发DAY6

通过epoll实现一个并发服务器 服务器 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/epoll.h…

Android getDrawable()和getColor()

Android getDrawable() 1.过时代码 虽然过时&#xff0c;但是不妨碍使用 context.getResources().getDrawable(R.drawable.xxx) 2.建议代码 context.getDrawable(R.drawable.xxx) 有API限制 3.最新代码 ContextCompat.getDrawable(getContext(), R.drawable.xxx); 有A…

C语言枚举与联合体详解

本篇文章带来枚举与联合体相关知识详细讲解&#xff01; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#xff01;&#xff01; 目录 一…

Qt中文显示乱码问题

解决方法&#xff1a; 添加#pragma execution_character_set("utf-8");

Redis缓存预热

说明&#xff1a;项目中使用到Redis&#xff0c;正常情况&#xff0c;我们会在用户首次查询数据的同时把该数据按照一定命名规则&#xff0c;存储到Redis中&#xff0c;称为冷启动&#xff08;如下图&#xff09;&#xff0c;这种方式在一些情况下可能会给数据库带来较大的压力…

JavaSE - 异常

目录 异常 一. 常见的异常 1. 算数异常&#xff08;ArithmeticException&#xff09; 2. 数组越界异常&#xff08;ArrayIndexOutOfBoundException&#xff09; 3. 空指针异常&#xff08;NullPointerException&#xff09; 4. 输入不匹配异常&#xff08;InputMismatchEx…

黑马头条---day1

手机端查看 docker 容器&#xff0c;镜像操作命令 1、docker删除所有镜像命令 删除所有镜像的命令是Docker中一个非常常见的操作。下面是具体的实现步骤和命令示例&#xff1a; $ docker stop $(docker ps -aq) 停止所有正在运行的容器。 $ docker rm $(docker ps -aq) 删…

数据库应用:rsync远程同步

目录 一、理论 1.rsync 2.rsync优缺点 3.rsync三种工作模式 4.rsync同步源服务器 3. 配置rsync下行同步&#xff08;定时同步&#xff09; 4.rsync实时同步&#xff08;上行同步&#xff09; 5.配置rsync实时同步&#xff08;上行同步&#xff09; 6.使用rsync快速删除…

数组中出现次数超过一半的数字——剑指 Offer 39

文章目录 题目描述法一 哈希表法二 摩尔投票 题目描述 法一 哈希表 使用哈希映射&#xff08;HashMap&#xff09;来存储每个元素以及出现的次数。对于哈希映射中的每个键值对&#xff0c;键表示一个元素&#xff0c;值表示该元素出现的次数。 class Solution { public:int maj…

XCTF_very_easy_sql

简单的进行sql注入测试后发现不简单尝试一下按照提示 结合这句提示应该是内部访问&#xff0c;所以采用的手段应该是ssrf顺便看看包 唯一值得关注的是set-cookie说回ssrf唯一能使用的方式应该是Gopher协议找到了一个POST的python脚本 import urllib.parsepayload ""…

Linux上定位线上CPU飙高

【模拟场景】 写一个java main函数&#xff0c;死循环打印 System.out.println(“111111”) &#xff0c; 将其打成jar包放在linux中执行 1、通过TOP命令找到CPU耗用最厉害的那个进程的PID 2、top -H -p 进程PID 找到进程下的所有线程 可以看到 pid 为 94384的线程耗用cpu …

未来将会有更多基于 Cortana 的设备

在前些日子的 Build 大会首日 Keynote 中&#xff0c;微软正式确认 HP 跟 Intel 也正在开发基于 Cortana 平台的联网家居产品&#xff0c;这是继推出 Invoke 喇叭的 Harman Kardon 后&#xff0c;又有知名大牌加入到 Cortana 的阵营当中&#xff0c;有这样的品牌资源背景&#…

【Linux】-进程概念及进程状态(僵尸进程和孤儿进程)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

基于中文金融知识的 LLaMA 系微调模型的智能问答系统:LLaMA大模型训练微调推理等详细教学

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

x86架构ubuntu22下运行WILL模拟器dophin

0. 环境 i5实体机ubuntu22 1. 安装依赖 $ sudo apt install build-essential git cmake ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libevdev-dev libusb-1.0-0-dev libxrandr-dev libxi-dev libpangocairo-1.0-0 qt6-base-private-dev libblueto…