人生难得几回搏,此时不搏待何时。这篇文章主要讲述<
简单分析;
汉诺塔问题相关的知识,希望能为你提供帮助。
汉诺塔是一个非常著名的游戏,游戏中将会有三根棍子,第一根棍子上有N个从大到小叠起来的盘子,游戏的目标是将这N个从大到小叠起来的盘子放到第三根棍子上。每一次只允许移动一个,而且大的盘子永远在小的盘子的下面。这也是非常著名的递归入门题。
文章图片
我们将通过调用三次递归函数来解决这个问题。
暂时不考虑代码,只考虑解题。
先考虑N=3的情况。
T(N,first,temp,end)
N是盘子的个数,first是第一根棍子,temp是我们的辅助棍(也就是第二根),end是第三根棍子.
步骤如下:
【< 简单分析; 汉诺塔问题】1.T(N-1,first,end,temp)
2.T(1,first,temp,end)
3.T(N-1,temp,first,end)
总体来看,其意思如下:
第一步:将除最下面的盘子外的“所有”盘子移动到辅助棍。
第二步:将最下面的盘子移动到第三根棍子。
第三步:将辅助棍上的盘子移动到第三根棍子。
文章图片
我们可以看到,第一个T(2,A,C,B)就是在执行第一步操作,T(1,A,B,C)就是在执行第二步操作,T(2,B,A,C)就是在执行第三步操作。
即便是N大于3,也可以用这个图的架构来解释,只不过是分支多了而已。
如果你细心,你会发现,当我们把最大的那块移动到C后,我们就可以当它不存在了,也就是我们需要移动的只是中间的n-1个,这样总数量就少了一个,然后继续进行操作,把他们除了最后一块其他全部重新全都移动到A(第一步),最后一块移动到C(第二步),这样就又少了一个,我们需要移动的只剩下n-2个。如此循环。
如果你还是无法理解,建议看多几次上图。
代码如下:
#include < stdio.h>
void move(int n, char first, char temp, char end);
int main()
move(3, A, B, C);
return 0;
void move(int n, char first, char temp, char end)
if (n == 1)
printf("%c --> %c\\n", first, end);
else
move(n - 1, first, end, temp);
//第一步
move(1, first, temp, end);
//第二步
move(n - 1, temp, first, end);
//第三步
欢迎关注微信公众号:幻象客
文章图片
推荐阅读
- SpringBoot | 3.1 配置数据源及JDBC #yyds干货盘点#
- saltstack-master配置文件-----详解#yyds干货盘点#
- #yyds干货盘点#jackson学习之七(常用Field注解)
- 设计模式13-- 模板模式怎么弄()
- saltstack-api日常操作#yyds干货盘点#
- #yyds干货盘点#netty系列之:Bootstrap,ServerBootstrap和netty中的实现
- Centos7 部署 Springboot步骤,小白详细教程,全图
- Egg.js 异常处理中间件jwt,实现接口权限控制
- Centos7安装Nginx详细安装步骤