汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。传说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
求解思路:
三根柱子(标记为 A、B、C),在柱子 A 上有从小到大叠放的n个圆盘,要将这n个圆盘从柱子 A 借助柱子 B 全部移动到柱子C上,移动过程中需要遵循以下规则:
1.每次只能移动一个圆盘。
2.大圆盘不能放在小圆盘上面。
代码实现及解析:
#include <stdio.h>//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可printf("%c->%c ", src, dest);return;}hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midprintf("%c->%c ", src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟后文的代码的区别在于,在n==1时,如果不执行return语句终止函数,就会依次执行后面三行代码(我们不希望执行后面三行代码)。而后文那个代码形式,如果n==1,else里面的代码就不执行了。
补充上面代码中“void hanoi(int n, char src, char mid, char dest)”函数中的return语句的解释:
void函数明确表示该函数不返回任何值。
1. 核心规则
在C语言中,将一个函数的返回类型声明为 void
,就是告诉编译器和程序员:“这个函数执行一些操作,但不会产生一个可供使用的返回值。” 因此,在 void
函数中使用 return
语句来返回一个值是非法的,会导致编译错误。
2. return
语句在 void
函数中的用法(可选)
虽然不能返回一个值,但你仍然可以在 void
函数中使用 return
语句。它的作用不再是返回值,而是立即终止函数的执行,提前从函数中退出。
这在某些条件下提前结束函数执行的场景中非常有用。
更多代码实现(功能一样,代码有细微区别):
#include <stdio.h>//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可printf("%c->%c ", src, dest);}else{hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midprintf("%c->%c ", src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟前文的代码的区别在于,如果n==1,else里面的代码就不执行了。前文那个代码形式,在n==1时,如果不执行return语句终止函数,就会依次执行后面三行代码(我们不希望执行后面三行代码);
#include <stdio.h>void move(char from, char to)
{printf("%c->%c", from, to);
}//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{ //src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可move( src, dest);}else{hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midmove(src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}