这应该是我学习C语言过程中遇到过的第一个难懂的题目,最近刚刚学完函数这一章节,对于定义函数的问题,还处在一知半解的阶段,我遇到了递归调用这一节中的经典题目,汉诺塔问题。
在Hanno函数中
当n为偶数时第一步都是A-->B
当n为奇数时第一步都是A-->C
void Hanno(int n, char a, char b, char c)
{
if (n == 1)
move(a, c);
else
{
Hanno(n - 1, a, c, b);
move(a, c);
Hanno(n - 1, b, a, c);
}
在做题的过程中一直不太理解实参的变换
每一层递归中实参B,C的值一直在变换
当我看到这图时一下子就恍然大悟
整体程序
#include
int cnt = 0;
void move(char a, char b);
void Hanno(int n, char a, char b, char c);
int main()
{
int n;
char a, b, c;
scanf("%d %c %c %c", &n, &a, &b, &c);
Hanno(n, a, b, c);
printf("%d", cnt);
return 0;
}
void Hanno(int n, char a, char b, char c)
{
if (n == 1)
move(a, c);
else
{
Hanno(n - 1, a, c, b);
move(a, c);
Hanno(n - 1, b, a, c);
}
return 0;
}
void move(char a, char b)
{
printf("%c-->%cn", a, b);
cnt++;
return;
}
程序说明
本题的真正执行移动圆盘这个动作的是函数void move(char a,char b),它将一个圆盘从第一个形参代表的柱子移动到第二个形参所代表的柱子。
特发此贴,以作纪念。
非原创,示意图转载自“红豆饭”。



