【算法】递归、搜索与回溯——汉诺塔

题解:汉诺塔(递归、搜索与回溯算法)

目录

  • 1.题目
  • 2.题目背景(拓展了解)
  • 3.题解
  • 4.参考代码
  • 5.细节
  • 6.总结

1.题目

题目链接:LINK
在这里插入图片描述
在这里插入图片描述

2.题目背景(拓展了解)

汉诺塔问题是一个通过隐式使用递归栈来进行实现的一个经典问题,该问题最早的发明人是法国数学家爱德华·卢卡斯。

汉诺塔传说
传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。若传说属实,僧侣们需要2^64 − 1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要5845亿年才能完成。整个宇宙现在也不过137亿年。这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。佛教中确实有“浮屠”(塔)这种建筑;有些浮屠亦遵守上述规则而建。“汉诺塔”一名可能是由中南半岛在殖民时期传入欧洲的。
在这里插入图片描述

与之相似的一个故事就是“棋盘放大米的故事”:
故事是这样的,最初一位大哥发明了一种玩具叫做围棋,这个围棋有64个格子组成,国王很高兴问发明者什么赏赐,发明者说到“第一个格子放1粒大米,第二个格子放2粒大米,第三个格子放4粒大米,此后每个格子都是前面的两倍大米,放满棋盘上的64个格子就好”,随后国王欣然接受,然而经过实践,即使把整个王国的大米搬过来放,也不能放满64个棋格。
在这里插入图片描述

这两个故事都揭示了一个道理——指数大爆炸

3.题解

我们枚举不同N情况下移动过程如下:
在这里插入图片描述
写递归的步骤
在这里插入图片描述

  • 函数头的设计
    除N = 1,情况外,所有N的情况都可以分为三步,即先把A柱上的前N-1个盘子放到B柱上,再把A柱的最下面一个盘子放到C上,再把B柱上的盘子放到C上。
    所以,解决此问题,我们只需要接受A、B、C、N的个数即可。

  • 函数体的设计
    先把A柱上的N-1个盘子放到B柱上,再把A的最下的一个盘子放到C上,再把B上的N-1个盘子放到C上。

  • 函数结束
    当N = 1时,不再满足上述三步走规律,只需要把那个盘子放到C上即可。

4.参考代码

class Solution {
public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {dfs(A,B,C,A.size());}void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n){//出递归if(n == 1){C.push_back(A.back());A.pop_back();return;}//1.先把A中的N-1个盘子借助C扔到B上dfs(A,C,B,n-1);//2.再把A中剩下的一个盘子扔到C上C.push_back(A.back());A.pop_back();//3.再把B中的N-1个盘子借助A扔到C上dfs(B,A,C,n-1);}
};

5.细节

思考:
如果我们把代码C.push_back(A.back())改成C.push_back(A[0])可以吗?为什么?

答:不行。 因为我们思考顺序与实际挪动顺序不一致。
虽然我们直觉上认为A.back()与A[0]在只剩下一个元素时候都表示的是最后的那个盘子,但是计算机运行的顺序跟我们脑子想的顺序并不一致,计算机先从最小的子问题(不可分割)的情况开始运算,而我们想的是先从最大问题的那个开始思考。
在只剩下一个元素的情况下A[0]和A.back()的确是一样的,但是计算机运行的时候并不是只有一个元素!!!

举个例子:
在这里插入图片描述

6.总结

汉诺塔作为经典的简单递归题目,是需要好好理解的,比如我上面提到的写递归的步骤以及为什么A.back()不能写成A[0]的问题。


EOF

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

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

相关文章

AI新时代的对决:OpenAI GPT-4o与Google Astra的较量

随着人工智能技术的飞速发展&#xff0c;两大巨头OpenAI和Google在近期分别推出了他们引人瞩目的新产品——GPT-4o和Project Astra。这场看似悄然而至&#xff0c;实则全球瞩目的竞赛&#xff0c;无疑预示着AI领域的重大突破和未来智能助理的新格局。 OpenAI的GPT-4o自宣布以来…

node_相关知识点

Node.js采用谷歌的V8引擎&#xff0c;是一个服务器端的、非阻断式I/O的、事件驱动的JavaScript运行环境&#xff0c;可优化应用程序的传输量和规模。传统服务器多线程&#xff08;一个请求一个线程&#xff09;易阻塞。 一、线程、进程&#xff1a; 进程&#xff1a;进程负责…

【从零开始学习RabbitMQ | 第二篇】如何确保MQ的可靠性和消费者可靠性

目录 前言&#xff1a; MQ可靠性&#xff1a; 数据持久化&#xff1a; Lazy Queue&#xff1a; 消费者可靠性&#xff1a; 消费者确认机制&#xff1a; 消费失败处理&#xff1a; MQ保证幂等性&#xff1a; 方法一&#xff1a; 总结&#xff1a; 前言&#xff1a; …

如何在Java中实现单例模式

一、引言 单例模式&#xff08;Singleton Pattern&#xff09;是Java中最常用的设计模式之一。它的主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。在许多场景下&#xff0c;如配置管理、线程池、数据库连接池等&#xff0c;单例模式都能发挥重要作用。 …

Debian12 安装留档@Virtual Box

在学蜜罐系统的时候&#xff0c;T-Pot 需要Debian&#xff0c;于是安装Debian12 下载安装光盘 先去中科大下载了12的安装光盘&#xff0c;然后在VirtualBox中创建一个新虚拟机&#xff0c;将安装光盘挂载上。 安装光盘下载地址&#xff1a;https://mirrors.ustc.edu.cn/debi…

【NumPy】全面解析NumPy的bitwise_and函数:高效按位与操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

算法训练 | 二叉树Part7 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数

目录 530.二叉搜索树的最小绝对差 数组法 双指针法 ⭐ 迭代法 501.二叉搜索树中的众数 双指针法 迭代法 530.二叉搜索树的最小绝对差 题目链接&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 数组…

三生随记——毛笔之咒

在一个被群山环抱的古老村落里&#xff0c;村民们过着平静而安宁的生活。然而&#xff0c;这个村落里隐藏着一个不为人知的秘密——一支传说中的毛笔。 这支毛笔的来历已无从考证&#xff0c;只知它世代相传&#xff0c;被村里的长者小心翼翼地收藏在祠堂的密室之中。毛笔的笔杆…

抖音小程序如何生成二维码

1.页面结构 <image src{{imgUrl}}></image>2.代码结构 onLoad(options) {if (options.param) {var qrCode 13246897451257 //传入生成二维码的字符串this.generateQRCode(qrCode);}},//调起第三方库qrCodegenerateQRCode(text) {//调用了qrCode里面的apiconst api…

【算法】Angelic Jelly天使果冻

✨题目链接&#xff1a; 天使果冻 ✨题目描述 Angelic Jelly 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x 个果冻中&#xff0c;美味度第二大的果冻有多少美味度&#xff1f; 一共有 q…

【静态分析】在springboot使用太阿(Tai-e)02

参考&#xff1a;使用太阿&#xff08;Tai-e&#xff09;进行静态代码安全分析&#xff08;spring-boot篇二&#xff09; - 先知社区 本文章使用的被分析代码为GitHub - JoyChou93/java-sec-code: Java web common vulnerabilities and security code which is base on springb…

本地部署 MiniCPM-Llama3-V 2.5

本地部署 MiniCPM-Llama3-V 2.5 0. 引言1. 性能评估2. 典型示例3. 本地部署4. 运行 WebUI Demo5. vLLM 部署 0. 引言 MiniCPM-Llama3-V 2.5 是 MiniCPM-V 系列的最新版本模型&#xff0c;基于 SigLip-400M 和 Llama3-8B-Instruct 构建&#xff0c;共 8B 参数量&#xff0c;相较…

Llama模型家族训练奖励模型Reward Model技术及代码实战(三) 使用 TRL 训练奖励模型

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

闲话 .NET(3):.NET Framework 的缺点

前言 2016 年&#xff0c;微软正式推出 .NET Core 1.0&#xff0c;并在 2019 年全面停止 .NET Framework 的更新。 .NET Core 并不是 .NET Framework 的升级版&#xff0c;而是一个从头开始开发的全新平台&#xff0c;一个跟 .NET Framework 截然不同的开源技术框架。 微软为…

一文详解手机在网状态查询API

手机在网状态查询就是指客户手机号码的在营运商数据库中标注的状态&#xff0c;有正常使用、停机、销号、未启用、异常、预销户、在网但不可用等一系列状态。而手机在网状态查询接口则是指通过接入api接口的实时数据对客户的手机号码开展在网状态查询。手机号码在网状态查询主要…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上&#xff0c;多位业内专家齐聚一堂&#xff0c;共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括&#xff1a; Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

Android NDK系列(一)手动搭建Native Project

使用NDK编写的本地代码具有高性能等特性&#xff0c;在游戏、图形处理等领域有广泛应用&#xff0c;下面介绍如何手动搭建一个纯C版的Android项目&#xff0c;通过该项目可以理解Android的项目结构。 一、创建settings.gradle Android项目是基于Gradle构建的&#xff0c;首先得…

数据结构之链表(高级应用)

基本的算法实践在上一篇博文&#xff0c;这篇博文向大家详细展示一下数据结构的高级应用&#xff0c;可能有些难&#xff0c;但这是重点&#xff0c;实用性很强&#xff0c;而且用的好往往事半功倍&#xff0c;想获得力量吗&#xff0c;开整&#xff1a; 我把他们分为这几块&a…

Captura完全免费的电脑录屏软件

一、简介 1、Captura 是一款免费开源的电脑录屏软件&#xff0c;允许用户捕捉电脑屏幕上的任意区域、窗口、甚至是全屏画面&#xff0c;并将这些画面录制为视频文件。这款软件具有多种功能&#xff0c;例如可以设置是否显示鼠标、记录鼠标点击、键盘按键、计时器以及声音等。此…

JVM1.8分代的理论基础和简单测试

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…