【数据结构】汉诺塔问题(丰富图解)

简介: 【数据结构】汉诺塔问题(丰富图解)

汉诺塔问题是什么?

通俗的说,给你三根立柱,分别命名为A、B、C,在A上有数量为n的盘子,并且这些盘子以从下到上,从大到小的顺序放置,现在需要你将A上的盘子挪动到C上去,要求:每次只能挪动一个盘子,并且在挪动过程中必须保证盘子在立柱上始终以从下到上,从大到小的顺序放置。


解题思路如何构建?

函数递归的学习中,我们知道运用递归的知识可以将一些复杂问题拆解成为一个个简单问题,那么汉诺塔就可以是一个复杂问题,那么我们只需要想最简单的情况,即假设只有两个圆盘,那么显而易见的解决方法就是:A->B,A->C,B->C,倘若此时增加圆盘数量为n,那么我们就可以将这n个盘子分为两部分,一部分是从1到(n-1),另一部分是最底下的一个盘子n,这两部分我们就可以看成是最简单的情况(两个盘子),而1到(n-1)我们也可以分化为两部分,即1到(n-2)为一部分,n-1为一部分,朋友们有没有发现此时我们就完成了函数递归了呢,我们已经将复杂的问题简单化了。

图一:表示的是将1到(n-1)看成一个盘子,将n看成一个盘子。

图二:将1(1到(n-2))看成一个盘子,将n-1看成一个盘子。(递归思想

这里需要注意的是大家不要忽略了③中B的处理,即需要递归的不仅是从A到B,还有从B到A的递归,图中没有画出,但是思路是一样的。

如此不管n为多少,我们都可以将n无限的分为两部分,这样一来只要我们知道汉诺塔最简单情况即两个盘子的情况如何解决就可以了,这也充分说明了函数递归的巧妙:复杂问题简单化


代码实现

#include<stdio.h>
void move(char m,char n)
{
  printf("%c->%c\n", m, n);
}
void hanoi(int n, char a, char b, char c)
{
  if (n == 1)
    move(a, c);
  else           
  {
    hanoi(n - 1, a, c, b);//ps①
    move(a, c);           //ps②     
    hanoi(n - 1, b, a, c);//ps③
  }//关于这里如果大家没看懂,我在后续说明中再做讲解。
}
int main()
{
  int num = 0;
  scanf_s("%d", &num);
  printf("盘子的数量为:%d\n", num);
  hanoi(num, 'A', 'B', 'C');
  return 0;
}

注意:实参A、B、C与形参a、b、c不同,大家不要搞混,a、b、c更多的可以理解为柱子顺序。

后续说明在这里:大家有没有发现在A->B中明显涉及到了复杂问题拆分,即将1到n-1看成一个盘子,所以需要第一个递归ps①,而ps②中并没有涉及到递归,大家结合图片就能知道了,而ps③涉及到的是在B->A时,与ps①同理,也是将复杂问题拆分,这里大家搞懂ps①的递归后,不妨尝试理解ps③,相信这样可以让你理解的更加深入。


总结

有时候可能更多的需要大家去画图并实操,仅仅看一两篇文章就能吃透不太现实,拒绝拿来主义,伙伴们,动起来💪💪💪

希望这篇文章可以对你有所帮助。

目录
相关文章
|
4月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
74 5
|
NoSQL 数据库 Redis
《如何使用Tair增强数据结构构建丰富在线实时场景》电子版地址
阿里云内存数据库Tair在完全兼容Redis的基础上,推出了 Tair 增强数据结构。Tair的增强数据结构有什么独特的优势?如何使用 TairRoaring 构建企业级实时人群服务?如何使用TairSearch 构建在线交互搜索?我们一一揭晓。
240 0
《如何使用Tair增强数据结构构建丰富在线实时场景》电子版地址
|
存储 JSON NoSQL
如何使用 Tair 增强数据结构构建丰富在线实时场景
Redis 数据结构模块是 Redis 提供的一种扩展数据结构功能的方式。Redis 提供了很多内置的数据结构,但是如何通过自己想要的方式来扩展自定义数据结构? Redis 在 4.0 引入 Redis Modules, 用户可以通过调用 Redis Modules API 来实现自定义的数据结构。
1375 0
如何使用 Tair 增强数据结构构建丰富在线实时场景
|
机器学习/深度学习 算法 C语言
《数据结构与课程设计》大作业 汉诺塔问题
《数据结构与课程设计》大作业 汉诺塔问题
343 0
《数据结构与课程设计》大作业 汉诺塔问题
|
算法 Java
Java数据结构和算法——汉诺塔问题
package com.tiantian.algorithms; /** * _|_1 | | * __|__2 | | * ___|___3 | | (1).把A上的4个木块移动到C上。
856 0
|
4月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
372 9
|
4月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
64 1
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
158 77
|
2天前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
15 4