目录
前言
书接上回,本文介绍另一个经典的递归模型——汉诺塔。汉诺塔游戏是大家耳熟能详的数学问题。汉诺塔起源于古老的印度传说,其规则如下:
1.有三根邻近的柱子,标号为A,B,C。
2.A柱子上从下向上按金字塔状叠起来着n个不同大小的圆盘。
3.现在把所有的盘子一个一个挪动到柱子B上,而且每一次挪动同一根柱子上都不可以出现大盘子在小盘子上方。
不难发现,汉诺塔问题也可以利用递归的策略解决。思路为:
1.将n层汉诺塔划分至最小;
2.将所有未按规则移至柱C的塔中最大的单塔从柱A移动到柱C,此时需要由柱B承担一个“中间状态”,即将其他单塔按规则移到柱B上;
3.递归调用上述步骤,直至最小单塔移在柱C上。
一、递归解决汉诺塔问题
不难发现,汉诺塔问题也可以利用递归的策略解决。思路为:
1.将n层汉诺塔划分至最小;
2.将所有未按规则移至柱C的塔中最大的单塔从柱A移动到柱C,此时需要由柱B承担一个“中间状态”,即将其他单塔按规则移到柱B上;
3.递归调用上述步骤,直至最小单塔移在柱C上。
二、主要代码
void Hanoi(int n, int A,int C){
if(n>0){
Hanoi(n-1,A,B,C);//C作为辅助,将A上的n-1层塔挪在B上
Move(n,A,B);//将A上编号为n的塔移到B上
Hanoi(n-1,C,B,A);
}
}
总结
汉诺塔问题是一个有趣的问题,但又非常清晰的体现了递归思想在问题求解中的应用,后序还要再进一步思考这个问题。