汉诺塔问题是一个经典的递归问题,具体怎么玩建议去4399玩几把试试,你可能会找到一点感觉,或者会发现自己真的智商不够用,比如我就是这样,只玩了四个饼的,发现一点小小的规律,但是莫慌,一会儿我们的攻略就出来了。
关键函数:
1,hanoi ( int n, char x, char y, char z) 形参说明:n为饼的个数,xyz分别表示三根柱子,注意这里一定要理解第形参x代表从哪根柱子上取下,y作为中转站,也就是经由y,最终把n个饼放到z上。比如变成hanoi ( n-1, y, x, z),就表示把n-1个饼从y取下经由x最终移动到z柱子。 另外,我觉得C语言中的汉诺塔递归过程一定要理解实参和形参的对应关系,如果这个很混乱可能就难以理解,以四个饼子为例,主函数中第一次调用传入的是hanoi(4, ' A ', ' B ', ' C '),也就是图示的将四个饼子从A经由B最终移动到C,形参实参不要整成一样的,不然可能更混乱。 2,move (char x, char y) 这个函数比较简单,这就是我们的攻略,把具体移动过程打印出来。
代码实现:
递归过程怎么走的可以去B站看一下懒猫老师的讲解,个人觉得还是比较好理解的,递归过程虽然理解,但是我个人觉得还是很神奇,不太明白原理是啥,有待加强学习。
void move(char c1,char c2)
{
printf("%c------>%c\n", c1, c2);
}
void hanoi(int n, char x, char y, char z)
{
if (n == 1)
move(x, z);
else
{
hanoi(n - 1, x, z, y);
move(x, z);
hanoi(n - 1, y, x, z);
}
}
int main()
{
int n = 0;
printf("please input num :");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}