经典递归算法——汉诺塔问题

article/2025/9/7 22:23:02

一、问题背景简介

         相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 

二、解题思路

        首先我们需要先明确我们每一步的目的,这里我们自底向上来进行思考,首先我们我们想到如果我们要将A上的所有盘子移动到C上,又得随时保证大盘子在下面小盘子在上面,那么我们开始思考如何将最大的盘子先放到C上,这样才能进行下一步。

        我们先明确ABC三个柱子的角色,一个作为起始位置、一个作为中转的位置、一个是目的位置;我们开始从最大的盘子开始自底向上考虑,这里我用四个盘子来做例子:

        ①我们要将第四个盘子移动到C,那么前三个盘子就必须先移动到B,这样才能让第四个盘子直接移动到C(因为要移动最下面的盘子的话,必须整个柱子只剩它一个或者它在最上层才能移动);

        ②要将前三个盘子移动到B,第三个盘子就要在B的最下面,现在就将第三个盘子看做底,那么肯定前两个盘子就要先移动到C,这样第三个盘子才能直接移动到B;

        ③要将前两个盘子移动到C,那么第二个盘子就必须在C的最下面,现在将第二个盘子看做底,那么第一个盘子就必须先移动到B,这样第二个盘子才能直接移动到C;

        ④第一个盘子可以直接移动到B;

        以上就是有四个盘子的时候第一步的思考,思考过程反过来就是移动步骤;每一步中的移动的思维就差不多;在同一层递归的整体的步骤就是:先将要移动的盘子上面的盘子放到中转的位置去,然后再把要移动的盘子放到目标位置去,最后将中转的位置的盘子再放到目标位置就完成了;每移动一次目标盘子,就需要执行一次以上步骤,因为我们移动的整体思路是自下而上的移动,所以只有当移动的盘子是最顶上的盘子或者只有它一个盘子的时候不需要执行这个三步;所以只要涉及到移动多个盘子就需要进行上述步骤,所以在每层递归中一开始的当前位置到中转,和最后的中转到目标位置,都需要递归执行,只有中间的当前位置直接到目标位置的这一步只移动一个盘子不需要递归。

三、代码实现展示

        1、Python实现

def Hanoi(n, current, transit, target):if n == 1:print(current, "-->", target)else:Hanoi(n - 1, current, target, transit)print(current, "-->", target)Hanoi(n - 1, transit, current, target)num = input("输入汉诺塔的层数:")
Hanoi(num, 'A', 'B', 'C')

                 这里需要注意一下递归的时候当前位置、中转位置、以及目标位置的转变(实参、形参的变化)。

        2、C语言实现

#include "stdio.h"void Hanoi(int n,char current,char transit,char target){if(n == 1){printf("%c-->%c\n",current,target);} else{Hanoi(n - 1,current,target,transit);printf("%c-->%c\n",current,target);Hanoi(n - 1,transit,current,target);}
}
int main() {int n;printf("请输入汉诺塔的层数:");scanf("%d",&n);Hanoi(n,'A','B','C');
}

                基本和python差不多。


http://chatgpt.dhexx.cn/article/nvJ72Wd9.shtml

相关文章

【C语言】递归详解汉诺塔问题

文章目录 前言汉诺塔移动图解汉诺塔移动次数汉诺塔的打印结语 如果无聊的话,就来逛逛 我的博客栈 吧! 🌹 前言 汉诺塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小…

Linux基本操作---实践+理解--CentOS 7

目录 CentOS系统ls查看信息cd目录切换文件操作系统关闭/重启防火墙操作 CentOS系统 Linux系统有很多,常见的Linux系统有乌班图(Ubuntu)、深度(deepin)、CentOS等等,CentOS 7 是目前比较流行的Linux操作系统…

Linux 文件操作基本命令

在Linux文件操作中,最常用的基本命令包括:打开或者创建文件,写入文件,读取文件 下面将依次介绍这几种操作的常用方法。 1.打开/创建文件 首先说明在VI编辑模式中,若要使用该API,需包含相应的头文件&…

Linux基本操作命令 实验

一、实验目的: 1. 熟悉Linux基本命令。 2. 熟悉Linux操作系统。 二、实验环境: 一台装有Linux的机器。 三、实验内容: 1.文件操作命令的使用。 用vi编辑器新建一个testl文件 输入this is testl~! 查看文件与目录ls 进入…

linux的基本操作命令

1.使用timedatectl查看时间状态 列出所有已知时区 修改时区为列出时区的某一个 首先打开linux系统,进入管理员模式,输入timedatectl [rootroot ~]# timedatectl Local time: Sun 2022-03-20 17:26:05 CSTUniversal time: Sun 2022-03-20 09:26:05 …

Linux实验一:熟悉Linux基本命令

【实验目的】 ‏(1)熟悉常用的文件和目录类命令。 ‏(2)熟悉常用的进程管理类命令。 ‎ ‏【实验要求】 ‎ 本实验的主要任务是在Linux终端窗口中练习已经学过的各种命令,熟练掌握常用命令的用法。清大家按照以下步骤完成本次实验。 ‏(1)以普通用户登录系统&…

linux配置网口的ip地址,Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址)...

Linux基本操作和基础命令(Linux修改IP地址以及修改网卡地址) 今天博主和大家聊一聊 Linux的基本操作,不喜勿喷,如有建议欢迎补充,讨论。 一.Linux网络 1.网卡的命名规则 CENTOS7采用dmidecode采集命名方案,以此来得到主板信息&…

Linux基本命令及编程环境实验

目录 一、Linux基本命令详细汇总 1、目录及文件相关命令 2、系统信息查询 3、文件操作(统计、过滤、搜索、权限) 4、其他命令 二、Linux终端上vi命令编程 1、进入vi命令模式 2、vi编辑模式 3、最后行模式 4、vi 编辑C源程序并编译运行 最后 一…

linux基本命令大全

基本命令 关机:shutdown -h halt init 0 poweroff 重启:shutdown -r reboot init 6 pwd:查看工作目录 ls:查看指定目录的内容 -l:列表显示 -a:显示所有,包括隐藏文件 -h:人性化的显示…

linux用户基本操作

用户的管理 1.创建一个新用户user1 ,设置其主目录为/home/use1 useradd user1 -d /home/user12.查看/etc/passwd文件的最后一行,看看如何记录 vim /etc/passwd3.查看文件/etc/shadow文件的最后一行 vim /etc/shadow4.给用户设置密码 passwd user1 123456//密码…

linux课程--实验一 Linux 基本命令操作1

一、实验目的: (1)掌握Linux各类命令的使用方法。 (2)熟悉Linux字符界面操作环境。 二、实验准备 (1)了解Linux命令行的基本概念。 (2)自己建立目录结构以及目录下的文件。 三、实验过程(内容包括:(1)练习linux命…

操作系统实验一 Linux基本操作|实验二 进程管理

由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档。 操作系统实验 目录 实验一 Linux基本操作实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统下的基本操作,对Linux操作系统有一个感性认识。 2.学…

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发&am…

操作系统——实验一(Linux基本操作)

操作系统——实验一(Linux基本操作) (1)练习Linux的基本安装和配置; (2)以root用户身份登陆,并使用“ls”,“cat”“cd”等常用命令来实现基本的文件操作并观察Linux文件系统的特点; &#xff…

Linux系统基础操作命令

目录 一、基本使用 1.编辑Linux命令行的辅助操作 2.常用的基础命令 1.切换用户(su) 2.pwd 查看当前工作目录 3.cd 切换工作目录 4.cp 复制 5.mkdir 创建目录 6.touch 创建文件 7.创建链接文件ln(软链接、硬链接) 8.alia…

Linux的基本操作

Linux的基本操作 文章目录 Linux的基本操作cd命令ls命令pwd命令touch命令cat命令mkdir命令rm命令cp命令mv命令man命令less命令head命令tail 命令date命令grep命令ps命令netstat命令 cd命令 语法:cd 目录名 功能:改变当前所在目录,将当前工作…

Linux基本操作之vi编辑器

Linux基本操作之vi编辑器 一、Vi编辑器的启动和退出启动退出 二、Vi编辑器的工作模式编辑模式插入模式命令模式 三、Vi编辑器的基本命令文件相关命令字符串搜索、替换和删除文本的复制、删除和移动 四、C/C编辑器gcc的使用1.编写代码2.使用命令编译和运行 一、Vi编辑器的启动和…

LINUX的基本操作学习总结

前言 从2020年11月定下了以后所打算从事的方向开始,就开始学习LINUX基础和LINUX环境编程,故谨以此文来记录LINUX的基础操作 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出 目录 1.LINUX的基础…

Linux基本操作之重定向文件

文章目录 RedirectionAppending to a fileRedirecting the Input通配符“*”和“?”文件名约定操作 Redirection 上一节 cat 命令的功能是将文件或标准输入组合输出到标准输出。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入…

实验一 Linux基本操作

实验一 Linux基本操作 1. 实验要求 (1)掌握启动和退出Linux 操作系统方法; (2)了解与熟悉Linux 操作系统常用的Shell命令使用; (3)掌握Linux 操作系统下C程序的编辑、编译…