前言:想了很久才理解,我觉得难点就在能不能理解那个递归的调用了,一直被形参绕晕,希望大家理解这个题的时候耐心一些,递归思想需要掌握牢固以后会用得上,下面进入正题:
题目:
有一个梵塔,塔内有三个座A、B、C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上。把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上,如下图。
目的就是将图一变成图二这样
现在有n个盘子,将他们全部移动到C柱子上,输出移动的过程。先奉上代码:
//汉诺塔问题---递归
#include<stdio.h>
int hnt(int n,char a , char b ,char c)
{
if(n==1)
printf("%c-->%c\n",a,c);
else
{ //刚开始都在a柱子上
hnt(n-1,a,c,b); //把n-1个移动到b柱子上
hnt(1,a,b,c); //把a上最后一个盘子从a移动到c
hnt(n-1,b,a,c); // 把n-1个盘子从b移动到c
}
}
int main()
{
int x;
printf("盘子数为:");
scanf("%d",&x);
if(x<1) //考虑程序健壮性时需要写上
printf("越界!");
else
hnt(x,'A','B','C');
return 0;
}
重点在这里
int hnt(int n,char a , char b ,char c)
{
if(n==1)
printf("%c-->%c\n",a,c);
else
{ //刚开始都在a柱子上
hnt(n-1,a,c,b); //把n-1个移动到b柱子上
hnt(1,a,b,c); //把a上最后一个盘子从a移动到c
hnt(n-1,b,a,c); // 把n-1个盘子从b移动到c
}
你可能会想,把n-1个移动到b上之后怎么办???
比如说现在有3个盘子,调用此函数后先执行hnt(2,a,c,b);
hnt(2,a,c,b)继续调用函数变为hnt(1,a,b,c),输出A–C;接着是调用里的第二个函数,即h(1,a,b,c)但是b,c的值刚刚已经换过,所以他表示hnt(1,a,c,b)表示从A–>B,接着是执行hnt(1,b,a,c)但是此时b,a,c意义已经改变,即hnt(1,c,a,b)表示从C–>B;
int hnt(int n,char a , char b ,char c)
它是随时更新的
剩下的大家就可以一 一列举了,慢慢就领悟其中的规律了。
希望大家可以手动画一画,自然就会了,加油!
若有出错的地方,还请大佬指出,感谢!!!