多图详解汉诺塔递归实现思路--含实现代码

article/2025/9/9 7:58:49

前言

为了节约大家的时间,本文对汉诺塔的定义就不做赘述了,如果有小伙伴不清楚汉诺塔的规则可以直接点蓝字跳转过去。

本篇博客内容

  • 汉诺塔实现的思路
  • 用递归的方式实现汉诺塔

汉诺塔实现的思路

我们先以两个瓷盘为例:

image-20220504132608602

由于小瓷盘1位于顶部,因此可以移动到B位置

image-20220504132811295

接着我们就可以将大瓷盘2移动到C位置,再将小瓷盘1移动到C位置,完成移动,两个磁盘的挪动就完成了。

image-20220504133044016

然后我们再以三个瓷盘为例:

image-20220504133130731

我们忽略最大的瓷盘,先考虑如何将剩余的瓷盘(1和2)移动到B位置,如果我们移动剩余的瓷盘的方式与之前移动两个瓷盘时一样,我们就可以将它们移动到B位置上。然后我们再将最大的瓷盘移动到C位置上,然后,再使用与之前相同的原理,我们将B位置上的瓷盘移动到C位置上。

image-20220504133442028

用数学归纳法证明可以通过任意数量的瓷盘达到目标:

当有一个瓷盘时,我们可以直接移动到C位置上。

假设有n个瓷盘时我们可以达到目标。

现在我们考虑移动n+1个瓷盘:

image-20220504133648610

我们先忽略最大的瓷盘

image-20220504133739130

假设我们能移动n个瓷盘,我们将n个瓷盘移到B位置上

image-20220504134021690

然后将最大的瓷盘移动到C位置上,最后我们将B位置上的n个瓷盘移动到C位置上,移动完成。证明完毕。

汉诺塔的解决方案:要解决n个瓷盘的汉诺塔时,需要使用n-1个瓷盘的解决方案;为了解决n-1个汉诺塔,我们将使用n-2个汉诺塔来解决,直到最后只有一个瓷盘的状态,递归解决。

用递归的方式实现汉诺塔

重点理解是理解代码中媒介的含义。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>void print_move(char a, char b) //挪动位置,将瓷盘从a位置挪动到b位置上。
{printf("%c -> %c\n", a, b);
}void hannuo(int n, char pos1, char pos2, char pos3)//这里的pos分别为起始位置,媒介位置,目的位置
{if (n == 1){print_move(pos1, pos3);//只剩一个盘子,直接将盘子移动到目的位置}else{hannuo(n-1,pos1,pos3,pos2);//将n-1个盘子从起始位置以pos3为媒介都挪到pos2上print_move(pos1, pos3);//这时只剩一个盘子在起始位置,需要移动到目的位置hannuo(n-1,pos2,pos1,pos3);//再将这n-1个盘子以pos1为媒介挪到pos3上}
}int main()
{int n = 0;//瓷盘的数量scanf("%d", &n);hannuo(n, 'a', 'b', 'c');//a、b、c分别代表三根柱子的位置;
}

代码运行实况:

3个瓷盘

在这里插入图片描述

4个瓷盘
在这里插入图片描述


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

相关文章

汉诺塔递归算法C++实现

算法介绍 其实算法非常简单&#xff0c;当盘子的个数为n时&#xff0c;移动的次数应等于2^n – 1&#xff08;有兴趣的可以自己证明试试看&#xff09;。后来一位美国学者发现一种出人意料的简单方法&#xff0c;只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型…

汉诺塔递归算法(C语言)

汉诺塔递归算法 一、引言二、解决汉诺塔问题&#xff08;1&#xff09;递归算法 三、C语言实现&#xff08;1&#xff09;代码实现&#xff08;2&#xff09;算法思想 四、结论 一、引言 汉诺塔问题是一个经典的数学谜题&#xff0c;它是在印度流传下来的&#xff0c;传说中有…

汉诺塔递归调用

1.递归算法 递归算法&#xff1a;是一种直接或者间接地调用自身的算法。在计算机编写程序中&#xff0c;递归算法对解决一大类问题是十分有效的&#xff0c;它往往使算法的描述简洁而且易于理解。 递归过程一般通过函数或子过程来实现。 递归算法的实质&#xff1a;是把问题转…

汉诺塔递归的空间复杂度_算法之美:解读递归算法原理和效率

对于很多人来说,都知道递归,也能看的懂递归,但在实际项目过程中,却不知道如何使用递归,这里给递归做个总结。 递归的定义 在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递和归,这正是递归思想…

汉诺塔递归问题的分析与Python实现

背景 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff0c;并仍保持原…

汉诺塔递归算法/搬金盘的婆罗门 - Python实现

汉诺塔递归算法/搬金盘的婆罗门 - Python实现 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许以纸质及电子出版为目的进行抄摘或改编。 1.《Python编程基础及应用…

汉诺塔递归的空间复杂度_学习算法绕不开的~~汉诺塔

大家好,我是老郝。本文就汉诺塔问题向大家阐述递归的思想。 【问题描述】 有三根柱子,最左边的柱子上从大到小放着很多的圆盘,要求把圆盘一个一个的放到最右边的柱子上并且只能小盘子压在大盘子上。(据说古代阿三要他们的和尚把64个圆盘从左到右放一遍,看到最后你就知道阿三…

汉诺塔递归的空间复杂度_【干货】Java算法复杂度

同一问题可用不同算法解决&#xff0c;而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 算法复杂度分为时间复杂度和空间复杂度。其作用&#xff1a; 时间复杂度是度量算法执行的时间长短&#xff1b;而空间复杂度是度量算法所需…

汉诺塔递归问题

汉诺塔问题&#xff1a; 这是一道著名的算法题&#xff0c;也是递归思想的典型体现。 可以总结&#xff0c;当圆盘数为n时&#xff0c;将最下层圆盘和其余上部份所有圆盘看作两个整体&#xff0c;则满足以下步骤&#xff1a; 1、把n-1个圆盘从A经过C移动到B 2、把第n个圆盘从…

汉诺塔递归算法python详细解析图_汉诺塔递归算法的图解(自我总结)

汉诺塔介绍 汉诺塔简单介绍&#xff1a; 有三根相邻的柱子&#xff0c;假定从左到右为A,B,C&#xff0c;A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘&#xff0c;要把所有盘子一个一个移动到柱子B上&#xff0c;并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。…

C#汉诺塔递归算法实现

目录: 一、什么是递归1.先来看一下一个递归的例子2.递归的基本原理 二、汉诺塔问题1.汉诺塔的故事2.回到编程&#xff0c;汉诺塔问题主要就是解决这个问题&#xff1a;3.怎么解决汉诺塔问题要解决汉诺塔问题就要用到递归思想&#xff0c;这里拿四层汉诺塔举例子&#xff1a; 4.…

递归算法 —— Hanoi汉诺塔游戏

前言 博客主页&#xff1a;干脆面la的主页 gitte链接&#xff1a;干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候&#xff0c;汉诺塔问题困扰了我很久。博主花了很长时间理解这道题目&#xff0c;因此整理出了用递归解决汉诺塔问题的思路&#xff0c;希望对大家有所…

计算任意位数的黑洞数

黑洞数是指这样的整数&#xff1a; 由这个数字每位数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。 例如3位黑洞数是495&#xff0c;因为954-459495&#xff0c;4位数字是6174&#xff0c;因为7641-14676174。 def max( x ):data[]while x/1!0:kx%10xx//10data.…

蓝桥杯 黑洞数 解题报告

任意一个5位数&#xff0c;比如&#xff1a;34256&#xff0c;把它的各位数字打乱&#xff0c;重新排列&#xff0c;可以得到一个最大的数&#xff1a;65432&#xff0c;一个最小的数23456。求这两个数字的差&#xff0c;得&#xff1a;41976&#xff0c;把这个数字再次重复上述…

黑洞数—python

黑洞数:黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者是冰雹原理中的“1”黑洞数 如果有…

6174 黑洞数字

关于6174这个数字的猜想是&#xff1a;从0到9取任意4个不全相同的数字&#xff0c;从大到小排列得到一个4位大数&#xff0c;从小到大排列得到一个4位小数&#xff0c;二者大减小做差&#xff0c;得到一个新的差值&#xff0c;这个值不足4位数补0&#xff0c;重复排列做差的操作…

求4位数的黑洞数

黑洞数又称陷阱数&#xff0c;是类具有奇特转换特性的整数。任何一个数字不全相同整数&#xff0c;经有限“重排求差”操作&#xff0c;总会得某一个或一些数&#xff0c;这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。或者…

C语言验证黑洞数6174

0x00 问题描述 问题简述&#xff1a;任意选一个四位数(数字不能全相同)&#xff0c;把所有数字从大到小排列&#xff0c;再把所有数字从小到大排列&#xff0c;用前者减去后者得到一个新的数。重复对新得到的数进行上述操作&#xff0c;7步以内必然会得到6174。 0x01 代码设计…

黑洞数 C语言

黑洞数也称为陷阱数&#xff0c;又称“Kaprekar问题”&#xff0c;是一类具有奇特转换特性的数。 任何一个各位数字不全相同的三位数&#xff0c;经有限次“重排求差”操作&#xff0c;总会得到495。 最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排…

黑洞数

黑洞数是指于四位数中&#xff0c;只要数字不完全相同&#xff0c;将数字由大到小的排列减去由小到大的排列。假设一开始选定的数字为&#xff0c;f()&#xff0c;f()&#xff0c;...&#xff0c;f() 用同样的规则继续算下去&#xff0c;最后的结果一定是6174。 比如说一开始选…