【算法 04】汉诺塔递归求解和通式求解

news2024/9/23 7:32:42

汉诺塔问题:一个经典的递归问题

请添加图片描述

汉诺塔(Tower of Hanoi)问题是一个源自古印度传说的经典益智游戏,也是心理学实验研究和计算机科学中常用的任务之一。该游戏通过三根高度相同的柱子和一系列大小及颜色不同的圆盘来构成,旨在将起始柱(A柱)上的所有圆盘按照大小顺序移动到目标柱(C柱)上,且每次只能移动一个圆盘,移动过程中必须保持大盘在下、小盘在上的规则。
请添加图片描述

历史背景

汉诺塔问题的起源有多种说法,其中一种是关于古印度圣庙的传说。相传大梵天在创造世界时,做了三根金刚石柱子,并在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。他命令婆罗门将这些圆盘按照规则重新摆放在另一根柱子上。而另一种说法则是由法国人M.Claus(Lucas)于1883年从泰国带至法国,并与法国数学家Edouard Lucas提及的波罗教塔故事相关联。

游戏规则

汉诺塔游戏的规则简单而明确:

  1. 目标:将所有圆盘从A柱移动到C柱,并保持原有的大小顺序。
  2. 操作规则:
    • 每次只能移动一个圆盘。
    • 在任何时刻,三根柱子上都保持大盘在下、小盘在上的顺序。
    • 圆盘可以置于A、B、C三根柱子中的任意一根上。
解决方法

汉诺塔问题是一个典型的递归问题。递归是一种函数调用自身的技术,通过将复杂问题分解为更小的子问题来解决。在汉诺塔问题中,我们可以将问题分解为以下三个步骤:

  1. 移动n-1个圆盘:以C柱为中介,将A柱上的前n-1个圆盘移动到B柱上。
  2. 移动第n个圆盘:将A柱上剩下的第n个圆盘(最大的圆盘)直接移动到C柱上。
  3. 再次移动n-1个圆盘:以A柱为中介,将B柱上的n-1个圆盘移动到C柱上。

这三个步骤实际上是将原问题转化为两个较小的子问题(即移动n-1个圆盘),通过递归调用解决这些子问题,最终完成整个问题的求解。

递归算法实现

在计算机科学中,汉诺塔问题常通过递归算法来实现。以下是一个简单的C语言实现示例:

#include <stdio.h>  
  
void hanoi(int n, char from, char aux, char to) {  
    if (n == 1) {  
        printf("Move disk 1 from %c to %c\n", from, to);  
        return;  
    }  
    hanoi(n - 1, from, to, aux);  // Step 1: Move n-1 disks from from to aux  
    printf("Move disk %d from %c to %c\n", n, from, to);  // Step 2: Move nth disk  
    hanoi(n - 1, aux, from, to);  // Step 3: Move n-1 disks from aux to to  
}  
  
int main() {  
    int n = 3;  
    hanoi(n, 'A', 'B', 'C');  
    return 0;  
}
复杂度分析

汉诺塔问题的时间复杂度为O(2^n),其中n是圆盘的数量。这是因为每次递归调用都会将问题规模减半(实际上是n-1),导致总的递归深度为n,而每一步递归都需要进行两次子问题的递归调用(除了基本情况),因此总的时间复杂度是指数级的。空间复杂度为O(n),这是因为递归过程中需要用到一个递归栈来保存每次递归调用的状态。

汉诺塔问题的通式解析

递归思路

首先,我们明确汉诺塔问题的递归性质:为了将n个圆盘从A移动到C,我们可以先将n-1个圆盘(不包括最大的那个)借助C移动到B,然后将剩下的最大圆盘直接移动到C,最后再将那n-1个圆盘从B借助A移动到C。这个过程中,每一步都是对原问题的一个简化,即递归地解决更小的问题。

通式的推导
  1. 基础情况
    当只有一个圆盘(n=1)时,显然只需要一步就可以将其从A移动到C。这是递归的基准情况,也是我们推导通式的起点。

  2. 递归假设
    假设我们已经知道移动n-1个圆盘所需的最少步骤数为T(n-1)。注意,这里的T(n-1)是一个假设,但我们相信它是正确的,因为我们正在尝试通过归纳法来证明它。

  3. 递归步骤
    根据汉诺塔问题的递归性质,我们可以将移动n个圆盘的问题分解为三个步骤:

    • 将n-1个圆盘从A移动到B,需要T(n-1)步。
    • 将第n个圆盘(最大的)从A移动到C,需要1步。
    • 将n-1个圆盘从B移动到C,再次需要T(n-1)步。

    因此,移动n个圆盘所需的总步骤数为 T(n) = 2*T(n-1) + 1。

  4. 归纳证明
    现在,我们需要证明对于所有的n(n≥1),T(n) = 2^n - 1。

    • 当n=1时,T(1) = 1 = 2^1 - 1,基础情况成立。
    • 假设当n=k时,T(k) = 2^k - 1成立。
    • 那么,当n=k+1时,T(k+1) = 2T(k) + 1 = 2(2^k - 1) + 1 = 2^(k+1) - 2 + 1 = 2^(k+1) - 1。
    • 因此,通过数学归纳法,我们可以证明对于所有的n,T(n) = 2^n - 1都成立。
int steps = (int)pow(2, n) - 1; 
//steps所需步数
结论

通过上述推导,我们得到了汉诺塔问题的通式:移动n个圆盘所需的最少步骤数为2^n - 1。这个通式不仅揭示了汉诺塔问题的本质,也展示了递归算法和数学归纳法的强大力量。它告诉我们,即使面对看似复杂的问题,只要能够将其分解为更小的子问题,并找到子问题之间的递推关系,我们就能够逐步逼近并最终找到问题的解。

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

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

相关文章

[Python学习日记-7] 初识基本数据类型(下)

简介 我们在基本数据类型&#xff08;上&#xff09;当中介绍了数据类型中的数据类型&#xff08;整数、浮点数&#xff09;、字符串和布尔值&#xff0c;那么我们还剩下列表和数组还没有介绍了&#xff0c;在 Python 中&#xff0c;列表&#xff08;List&#xff09;是一种有序…

力扣Hot100-final关键字,常量,抽象类(模板方法设计模式),接口

&#xff08;一&#xff09;final关键字 &#xff08;2&#xff09;常量 使用static final 修饰的成员变量被称为常量 作用&#xff1a;&#xff1b;通常用于记录系统的配置信息 注意&#xff1a;产量命名要求&#xff1a;单词大写&#xff0c;下划线连接多个单词 产量优势…

windows下使用vcpkg编译libcurl库并使用C++实现ftp上传下载功能

1、下载安装vcpkg git clone https://github.com/microsoft/vcpkg2、编译vcpkg 使用cmd命令 D:\Code\ThirdParty>cd vcpkg D:\Code\ThirdParty\vcpkg>bootstrap-vcpkg.bat3、使用vcpkg编译所需的库 进入vckpkg目录&#xff0c;使用vckpkg install 命令进行安装。在安…

OJ题——二叉树(最大深度/平衡二叉树/前序遍历构建)

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 题目一&#xff08;最大深度&#xff09; 利用分治的思想&…

饿了么新财年开门见喜:亏损减负,收入增肌

撰稿 | 行星 来源 | 贝多财经 8月15日&#xff0c;阿里巴巴对外发布2025财年一季度&#xff08;即自然年2024年二季度&#xff09;业绩。不难看出&#xff0c;受益于饿了么和高德订单的显著增长&#xff0c;以及市场营销服务收入的明显拉升&#xff0c;该季度本地生活集团成绩…

10.DMA

理论 12个通道&#xff1a;DMA1&#xff08;7&#xff09;DMA2&#xff08;5&#xff09; 方向&#xff1a;存储器和存储器间(DMA_MEMORY_TO_MEMORY)、外设到存储器(DMA_PERIPH_TO_MEMORY)、存储器到外设(DMA_MEMORY_TO_PERIPH) 闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外…

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI&#xff08;Service Provider Interface&#xff09; 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …

一个模型,多种作物:迁移学习如何提升设施农业AI模型效能

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;设施农业是现代农业的"压舱石",但传统的经验式管理模式已难以为继。在数字经济时代,设施农业亟需向数字化、网络化、智能化转型升级。以人工智能为代表的信息技术,正在为设施农业插上腾飞的翅膀。作为…

Kafka主题(Topic/文件夹)的操作

Kafka主题&#xff08;Topic/文件夹&#xff09;的操作 1、Kafka主题&#xff08;Topic/文件夹&#xff09;2、Kafka主题&#xff08;Topic/文件夹&#xff09;的一些操作2.1、创建主题&#xff08;Topic/文件夹&#xff09;2.2、列出所有主题&#xff08;Topic/文件夹&#xf…

8路VBO转HDMI2.0支持4K60频率ITE6265芯片方案心得分享

在此之前&#xff0c;有人找到我这边询问能不能将智能电视主板改成机顶盒&#xff0c;将VBO信号转换输出位HDMI进行投屏&#xff0c;具体应用奇奇怪怪&#xff01;但是奈何是甲方大佬。认命照做。从网上也有搜索了解过这类芯片&#xff0c;发现资料很少&#xff0c;所以有了这篇…

基于免疫算法的最优物流仓储点选址方案MATLAB仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于免疫算法的最优物流仓储点选址方案MATLAB仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09; 3…

STM32标准库学习笔记-1.基础知识

STM32介绍&#xff1a; STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ARM的含义&#xff1a; 公司名称&#xff1a;ARM公司成立于1990年&#xff0c;全称是Advanced RISC Machines&#xff08;RISC:Reduced Instruction Set Computer 精简指令集计算机 相对应有C…

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…

C语言日常练习 Day17

目录 一、找出一个二维数组的鞍点 二、有一篇文章&#xff0c;共有3行文字&#xff0c;每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数 三、有一行电文&#xff0c;已按下面规律编译成密码&#xff1a;A->Z,a->z,B->Y,…

mp3格式转换器推荐哪个?音质无损转换新选择

暑假在家&#xff0c;想要自己学着制作独一无二的彩铃吗&#xff1f;首先得解决音乐格式的难题。 面对众多mp3格式转换app&#xff0c;你是否也在犹豫“mp3格式转换app常用哪个&#xff1f;” 别担心&#xff0c;热门mp3格式转换工具大盘点来袭&#xff0c;帮你轻松搞定格式转…

《深入浅出WPF》读书笔记.5控件与布局(上)

《深入浅出WPF》读书笔记.5控件与布局(上) 背景 深入浅出WPF书籍学习笔记附代码。WPF中数据是核心是主动的,UI是数据的表达是被动的。 程序的本质是数据算法&#xff1b;控件的本质是数据行为&#xff1b; 5.控件与布局 一、6类控件派生关系 1.布局控件:可以容纳多个控件…

为什么神经网络常常是linear+relu的堆叠

特征提取&#xff1a;每一层的线性变换可以看作是在提取输入数据的不同特征。通过堆叠多个这样的层&#xff0c;网络能够学习从原始数据中提取越来越复杂的特征表示非线性关系&#xff1a;单个神经元的线性变换是线性的&#xff0c;但通过引入非线性激活函数&#xff08;例如Re…

重生奇迹MU 百变职业 打造属于你的专属职业

重生奇迹MU让每个玩家都能够在这里打破常规、展示个性&#xff0c;以自己的方式创造专属的游戏体验。其中的加点玩法是最为重要的部分之一&#xff0c;它不仅在角色成长过程中发挥着重要作用&#xff0c;还能够激发玩家的想象力&#xff0c;让他们自由设计全新的玩法。同样一个…

美股收涨,半导体板块领涨;苹果iPhone出货预测上调

市场概况 在昨夜的交易中&#xff0c;美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%&#xff0c;纳斯达克综合指数上涨2.34%&#xff0c;标准普尔500指数上涨1.61%。值得注意的是&#xff0c;英伟达股票涨幅近4%&#xff0c;推动了科技股的整体表现。美国十年期国债收益…

【W1】记录文档

标题 导出数据结构关系结构YOLOVOCLabelMeCOCOJSON可视化 导出数据结构 关系结构 任务 -> 批次 -> 条目 -> 帧YOLO 一张图片对应一个文本文件 .txt<object-class> <x> <y> <width> <height>归一化处理找到物体在图像中的中心点的 x&a…