【算法篇】汉诺塔问题

article/2025/9/7 15:58:15

 汉诺塔问题是一个递归的经典范例。

    让我们先从移动一个盘开始,逐渐增加需要移动的盘数。
    当我们需要移动一个盘时,只需将该盘移动至C杆。

int c = 0;
void move(char a, char b)
{printf("第%d步为:%c->%c\n",++c, a, b);
}


    当我们需要移动两个盘时,便需要在移动一个盘的基础上,再移动一个(此时这2个盘最终会移动到B杆,这个问题我们会在后面解决)。
    移动三个盘时,便要在移动两个盘的基础上再移动一个,继续增加下去,我们会发现:我们在需要移动n个盘时,只要在(n-1)个盘的基础上再移动一个盘。我们将这n个盘看成两部分,第n个盘,和前(n-1)个盘的整体。这样当n>=2时,都是同样的模型:先将上面的盘移动到B杆,再将最下面的盘移动到C杆,最后将B杆上的盘移到C杆,放在最下面的盘之上。

   

 

我们在需要移动n个盘时,已经成功移动了(n-1)个盘,我们只需将移动(n-1)个盘的过程写成一个函数。移动n个盘需要调用移动(n-1)个盘的函数,移动(n-1)个盘需要调用移动(n-2)个盘的函数......最终递推到移动2个盘会调用移动1个盘的函数,这便是函数的递归。

    通过以上的思考逻辑,我们会发现:编写递归函数时,虽然程序是在最外层的函数层层调用至最内层,但我们的逻辑出发点还是要落在最内层的函数,也就是递归停止的那层函数。
  
    但是当我们尝试写出代码时,会发现出现了新的问题,那就是我们调用的移动(n-1)函数最终会将(n-1)个盘移动到C盘,这也就代表着第n个盘只能移动到B杆,所以最终这全部n个盘也会在B杆。探寻一下规律,我们会发现,移动到B杆和移动到C杆的现象是交替出现的。我们当然也可以通过单双数来区分,但这样不仅麻烦,而且低效。因为在代码中,杆不是实体,只能用符号储存在变量中来表示对应的杆。我们尝试将杆的位置看成储存杆的变量,而杆本身只是一个符号


       

        我们在调用移动(n-1)的函数时,可以通过函数的形参进行“换杆”。我们只需要在调用函数时更换参数位置,便可以将形参中的值互换,实现“换杆”操作,保证无论移动多少个盘,最终都在C杆上。

void hanotower(int n, char a, char b, char c);hanotower(n - 1, a, c, b);//将(n-1)个盘整体移动,并将c杆与b杆交换位置


      最后一步便是将b杆的(n-1)个盘整体移到C杆,放在第n个盘之上。相信在接受了以上的思想后,这一步也会自然的以这个思路思考。既然能将A杆到C杆修改为A杆到B杆,自然也能将其修改为B杆到C杆。依然只需要在调用函数时改变参数位置。

void hanotower(int n, char a, char b, char c);hanotower(n - 1, b, a, c);//将(n-1)个盘整体移动,并将a杆与b杆交换位置

全部代码为:

#include<stdio.h>
int c = 0;
void move(char a, char b)
{printf("第%d步为:%c->%c\n",++c, a, b);
}
void hanotower(int n, char a, char b, char c)
{if (n == 1)move(a, c);else{hanotower(n - 1, a, c, b);//将(n-1)个盘整体移动,并将c杆与b杆交换位置move(a, c);hanotower(n - 1, b, a, c);//将(n-1)个盘整体移动,并将a杆与b杆交换位置}
}
int main()
{int n = 0;scanf_s("%d", &n);hanotower(n, 'A', 'B', 'C');return 0;
}

 通过这个例子,我们可以初步理解一些递归的思想,也能把握一些理解递归的方法:

1.由里到外,从递归终止的那层开始,理解每一层函数的作用

2.在使用时,知道每一层函数的作用就已经足够了,在编写时试图由外向内将代码一层层展开来理解反而容易感到困惑,影响使用的逻辑。


http://chatgpt.dhexx.cn/article/0Yqkw2EM.shtml

相关文章

C语言实现汉诺塔问题(保姆式讲解)

前言: 大家好&#xff0c;又是再一次分享文章&#xff0c;我十分感谢各位能够点开这篇花费我颇多时间才解决的汉诺塔问题&#xff0c;接下来我就要分享一下自己的所思所想&#xff0c;希望能给各位带来一些不一样的收获吧。 提醒: 汉诺塔问题的本质是函数递归&#xff0c;而函数…

关于汉诺塔问题

首先&#xff0c;我们要了解什么是汉诺塔问题。 汉诺塔问题源于古印度的一种游戏&#xff0c;而这种游戏是指在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘。而我们游戏的目标则是&#xff1a;把A杆上的金盘全部移…

【C语言】汉诺塔问题的解决办法(附图)

1.游戏规则 汉诺塔(Hanoi)游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个盘子。游戏的目标&#xff1a;把A杆上的盘子全部移到C杆上&#xff0c;并仍保持原有顺序叠好。操作规则&#xff1a;每次只能移动一个盘子…

Python解决汉诺塔问题

问题引入 汉诺塔问题源于印度一个古老传说。相传大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;任何时候&#xff0c;在小…

汉诺塔问题(C语言实现)

前言 一、汉诺塔圆盘的移动步数 二、汉诺塔圆盘移动步骤 总结 前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序…

Java|汉诺塔问题详解

文章目录 汉诺塔问题&#xff1a;编程要求&#xff1a;解题过程&#xff1a;代码实现&#xff1a;总结 汉诺塔问题&#xff1a; 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆…

C++解决汉诺塔问题

Description 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C&#xff0c;A上面套着 n n n个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个小&#xff0c;依次叠上去&…

汉诺塔问题超级详解

汉诺塔 汉诺塔问题图解代码 汉诺塔问题 1&#xff0c;我们为了后期方便讲解首先进行一个简单的命名—— 起始柱&#xff1a;1&#xff1b; 过度柱&#xff1a; 2&#xff1b; 目标住&#xff1a;3&#xff1b; 2&#xff0c;由于汉诺塔问题是一个明显的递归问题&#xff0c;所以…

汉诺塔问题解析(C语言)

文章目录 背景一、汉诺塔和递归二、代码实现总结 背景 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄…

python实现汉诺塔问题

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞n片黄金圆盘。大梵天命令婆罗门把圆盘从下自上开始、按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;小圆盘上不能放…

Python实现 — — 汉诺塔问题

我们今天来看一个很有意思的实例&#xff0c;叫做汉诺塔问题。 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着…

汉诺塔问题(Python实现)

前言 1.先谈一下什么是递归&#xff1f; 我自己的理解就是&#xff1a;将自身的问题不断减小规模&#xff0c;直到减小到无法减小为止。&#xff08;到达递归结束条件&#xff09;然后从小问题开始解决&#xff0c;小问题逐个解决之后&#xff0c;大问题也就迎刃而解了&#…

汉诺塔问题详解(C语言)

文章目录 前言1. 导入汉诺塔问题2. 预备知识3. 分析问题4. 编程解决问题 前言 汉诺塔问题是一个古典的数学问题&#xff0c;本文主要和大家一起用c语言解决汉诺塔问题。 1. 导入汉诺塔问题 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜…

汉诺塔问题——递归算法

一、问题描述 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把…

汉诺塔问题详解

目录 一、汉诺塔问题 二、汉诺塔问题思路 三、图示化思路 1、汉诺塔一个盘子 2、汉诺塔两个盘子 3、汉诺塔三个盘子 4、想法 四、代码的实现 一、汉诺塔问题 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源…

c语言汉诺塔问题详解

一、前言 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按…

图解汉诺塔问题(递归求解)

汉诺塔&#xff1a;汉诺塔(Tower of Hanoi)源于印度传说中&#xff0c;大梵天创造世界时造了三根金钢石柱子&#xff0c;其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;在小圆盘上不能放大圆…

汉诺塔(Hanoi)问题归纳总结

一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔&#xff1a; 外文算法书对汉诺塔问题的描述&#xff1a; 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步。 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可以清晰的看出分治思想以及递归过程 算法采用了分治的…

汉诺塔问题(Hanoi)

汉诺塔问题&#xff0c;是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘&#xff0c;三根柱子分别为起始柱A、辅助柱B及目标柱C。 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置…

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

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