欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hanio(汉诺)塔的递归问题

程序员文章站 2024-03-24 15:22:40
...
                               Hanio(汉诺)塔

问题是这样的:古代有一个梵塔,塔内有3座塔,用
A,B,C来表示,开始在A塔上有64个大小不等的盘子,大的在下,小的在上。有人想要把64个盘子从A移到C上,每次只能移动一个盘子,且规定在移动的过程中3座塔上必须保证大盘在下,小盘在上。移动的过程可以使用空闲的那座塔。该怎么用程序去实现这个移动盘子的过程呢?
Hanio(汉诺)塔的递归问题
首先我们可以用递归的思想将问题由复杂简单化,如果能先把63个盘子从A挪到B闪,然后把最下面的盘子移到C上,最后把63个盘子挪到C上就能解决这个问题。(先别思考怎么把63个盘子挪到B上)假设有3个人;
第一个人想:1.把63个盘子由 A ->B;
2.把最底下的一个盘子由 A ->C;
3.把63个盘子由 B ->C;
第二个人想:(怎么把63个盘子由A ->B?)
1.把62个盘子由 A -> C;
2.把1个盘子(最底下的盘子不动,移得是倒数第二个盘子)由 A -> B;
3.把62个盘子由 C ->B;
第三个人想:(怎么把62个盘子由 A -> C?)
1.把61个盘子由A -> B;
2.把1个盘子由A -> C;
3.把61个盘子由A ->C;
第四个想怎么把61个盘知道子由A ->C,第五,六·····,每个人将问题层层下放,都让下一个人去解决,直到最后一个人将其解决,这就是递归的思想。
经过分析,得知将n个盘子从A移动到C的步骤为:
1. 将A上的n-1个盘子 借助C移到B上;
2. 把A上剩余的一个盘子移到C;
3. 将n-1个盘子从B 移到C上。
写成的代码如下:在这里插入代码片
#include<stdio.h>
void move(char a, char b){      //A,B,C之间盘子移动的方向
printf("%c -> %c\n", a, b);
}
void hanio(int n , char one , char two, char three) //将n个盘子由one借助two移到three
{  
if (n == 1){
move(one, three);   //当只有一个盘子是直接由移one到three
}
else
{
hanio(n - 1, one, three, two);  //如果盘子数不为1,调用hanio,把n-1个盘子由one借助three移到two
move(one, three);  //把剩下的盘子移到three
hanio(n - 1, two, one, three);   接续解决n-1盘子的移动问题
}

}
int main(){
char one, two, three;
int diskes;
scanf("%d", &diskes);
hanio(diskes,‘A’, ‘B’, ‘C’);  
return 0;
}
输入 n = 3(3个盘子),移动的过程如下:
Hanio(汉诺)塔的递归问题