汉诺塔问题是一个古典的数学模型,是一个用递归问题解决的典型例子,问题如下:古代有个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不定,大的在下,小的在上。有一个老和尚想把这64个盘子从A移到C,但规定一次只能移动一个盘子,且在移动过程中在3个座上始终保持大盘在下,小盘在上,在移动过程中可利用B座。
解题思路:如果用人为移动的话需要移动2^64次,移一辈子都移不完,但用递归的话很快就可以完成。
假如有两个盘子,将A最上面的小盘移到B上,再将A的大盘移动到C上,最后将B上移动到C。
假如有三个盘子,将A最上面的小盘移到c上,将A的中盘移动到B上,再将C上移动到B。最后将A上移动到C,最后将B按照移动两个盘子的方法移动到C上。
假如有四个盘子……
以此类推,总之一直保持将A上除了最大盘之外的所有盘移动到B上,将A移动到C,最后再将B全部移到C上。
代码如下所示:
#include <stdio.h>
void Move(char x,char y)
{
printf("%c->%c\n",x,y);
}
void Hanoi(int n,char a,char b,char c)
{
if(n==1)
{
Move(a,c);//交换a,c
}
else
{
Hanoi(n-1,a,c,b);//给N-1,开始递归 交换C,B
Move(a,c);
Hanoi(n-1,b,a,c);//交换B,A,相当于将A上的放到了B上
}
}
int main()
{
Hanoi(2,'A','B','C');
return 0;
}