题目:
这是一个典型的用递归解决的例子,问题是这样的:古代有一个梵塔,塔内有三个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上,有一个和尚想把这64 个盘子从A移到C,规定每次只能移到一个盘子且在移的过程中始终保持打大的在下,小的在上。用编程写出移动过程。
解题思路:
这个问题看着很麻烦,不知道从何下手,那是想的太复杂,类似这种复杂的问题,首先要做的就是它简单化。我们怎么完成这个呢?应该这样想,如果有另一个和尚把上面63个盘子移走。那么,问题就解决了。此时,老和尚要这样做:
1.让第二个和尚将63 个盘子从A盘移到B盘:
2.自己将最下面的盘子从A盘移到C盘:
3.在让第二个和尚将63个盘子从B盘移到C座。
现在就完成了,此时有一个问题就是怎么让第二个和尚从A盘移到B盘?这时 需要第三个和尚把62个盘子移走,第二个和尚就能把第63个盘子从A盘移到B盘。第三个和尚需要这样做:
1. 让第三个和尚将62个盘子从A移到C盘;
2.自己将第63个盘子从A盘移到B 盘;
3.在让第三个和尚将62个盘子从C盘移到B 盘。
如此递归下去,可见,递归的最后一个条件是最后一个和尚只须移到一个盘子。
编写程序:
用两个函数实现上述功能,hanoi函数实现小和尚的任务,用move函数模拟老和尚自己移到盘子的任务。
void move(char x,char y) { printf("%c-------%c\n",x,y); } void hanoi(int m,char a,char b,char c) { void move(char x,char y); if(m==1) { move(a,c); } else { hanoi( m-1,a, c, b);//中间过程 move(a,c); //移到正确的地方的函数 hanoi( m-1, b, a, c);//中间过程 } } int main() { int n=0; int m=0; printf("请输入盘子数:"); scanf("%d",&m); hanoi(m,'A','B','C'); system("pause"); return 0; }
结果如下: