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

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

汉诺塔问题是什么?

通俗的说,给你三根立柱,分别命名为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③,相信这样可以让你理解的更加深入。


总结

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

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

目录
相关文章
|
NoSQL 数据库 Redis
《如何使用Tair增强数据结构构建丰富在线实时场景》电子版地址
阿里云内存数据库Tair在完全兼容Redis的基础上,推出了 Tair 增强数据结构。Tair的增强数据结构有什么独特的优势?如何使用 TairRoaring 构建企业级实时人群服务?如何使用TairSearch 构建在线交互搜索?我们一一揭晓。
223 0
《如何使用Tair增强数据结构构建丰富在线实时场景》电子版地址
|
存储 JSON NoSQL
如何使用 Tair 增强数据结构构建丰富在线实时场景
Redis 数据结构模块是 Redis 提供的一种扩展数据结构功能的方式。Redis 提供了很多内置的数据结构,但是如何通过自己想要的方式来扩展自定义数据结构? Redis 在 4.0 引入 Redis Modules, 用户可以通过调用 Redis Modules API 来实现自定义的数据结构。
1316 0
如何使用 Tair 增强数据结构构建丰富在线实时场景
|
机器学习/深度学习 算法 C语言
《数据结构与课程设计》大作业 汉诺塔问题
《数据结构与课程设计》大作业 汉诺塔问题
313 0
《数据结构与课程设计》大作业 汉诺塔问题
|
算法 Java
Java数据结构和算法——汉诺塔问题
package com.tiantian.algorithms; /** * _|_1 | | * __|__2 | | * ___|___3 | | (1).把A上的4个木块移动到C上。
831 0
|
2天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
2天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
06_用栈来求解汉诺塔问题
06_用栈来求解汉诺塔问题
05_用一个栈实现另一个栈的排序
05_用一个栈实现另一个栈的排序