最干hanoi,看完直呼口干舌燥
Hanoi(汉诺塔问题)
一、什么是汉诺塔
在研究汉诺塔问题时,我们要明白到底什么是汉诺塔。
1、有三根相邻的柱子,标号为A,B,C。 2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
关于汉诺塔的基本玩法呢,
大家也可以去度娘上搜索一下,切实感受一下。
本篇主要介绍解决汉诺塔问题的思想,所以玩法就不过多赘述。
二、分析
1、移动过程
就可以将其抽象成(这里是破解汉诺塔思想的关键):
假设A杆上有n个圆盘
第一步:把n - 1个圆盘从A杆经由C杆移动到B杆
第二步:将A杆上的第n个圆盘移动到C杆
第三步:再将n - 1个圆盘从B经A移动到C
2、应用思想+函数雏形
通过分析我们可以发现,汉诺塔问题其实就是运用了递归的思想:
1.有一个跳出条件:
n = 1时
只剩下一个圆盘,所以直接移动到C杆就好了
2.逐渐的接近这一跳出条件:
移动n个圆盘和移动n-1个圆盘的过程本质上是相似的;
但是其中的过程又完全不一样,因为圆盘插入的杆子变了
所以hanoi的函数雏形就可以大致表达出来
函数共有四个未知数,其中n代表圆盘的个数,A,B,C分别代表的三个杆子。
第一步:把n - 1个圆盘从A杆经由C杆移动到B杆
第二步:将A杆上的第n个圆盘移动到C杆
第三步:再将n - 1个圆盘从B经A移动到C
所以将上述三步用代码语言写出就是这样
其中要注意的是,第二步永远只是将A杆上的第n个圆盘移动到C杆,所以不是递归函数。
3、部分代码
通过上述