和很多人一样,我刚刚接触汉诺塔的时候,可能说是头晕目眩,立马放弃。
但如果用图形表示感觉会好很多。
以下是我的学习思路:
汉诺塔问题
首先。递归的思路是什么?
把复杂的问题简单化
这里有四层塔,我们要在大塔不压小塔的情况下,把塔从x移动到z。(灵魂手绘看得懂就行)
f
(
n
,
x
,
y
,
z
)
f(n,x,y,z)
f(n,x,y,z)
其中
n
n
n—汉诺塔层数
x
x
x—x轴
y
y
y—y轴
z
z
z—z轴
这个函数的功能是把n层汉诺塔从x移动到z,且中间要通过y。(当然这里的x、y、z都是形参,你传入什么就是什么,不代表图中的轴)
本着把复杂问题简单化的原则,每一个步骤都用一条语句实现。
步骤1:
步骤2
现在你可以愉快的把x轴上的一层塔移动到z轴上了!
步骤3:
把y轴上的n-1层塔移动到z轴上,通过x轴。
技术总结
当然有一种例外情况(也是递归出口),当n=1时,可以直接从x轴移动到z轴。
好的现在开始写程序(我用的是c,函数名称叫:hanota)
#include <stdio.h>
void hanota(int n, char x, char y, char z)
{
if (n == 1)
{
printf("%c --> %c\n", x, z);
}
else
{
hanota(n - 1, x, z, y);
hanota(1, x, y, z);
hanota(n - 1, y, x, z);
}
}
int main(void)
{
char x ='x';
char y ='y';
char z ='z';
int n = 4;
hanota(n, x, y, z);
}
/*
结果输出:
x --> y
x --> z
y --> z
x --> y
z --> x
z --> y
x --> y
x --> z
y --> z
y --> x
z --> x
y --> z
x --> y
x --> z
y --> z
*/