Hanio(汉诺)塔的递归问题

                               Hanio(汉诺)塔

问题是这样的:古代有一个梵塔,塔内有3座塔,用
A,B,C来表示,开始在A塔上有64个大小不等的盘子,大的在下,小的在上。有人想要把64个盘子从A移到C上,每次只能移动一个盘子,且规定在移动的过程中3座塔上必须保证大盘在下,小盘在上。移动的过程可以使用空闲的那座塔。该怎么用程序去实现这个移动盘子的过程呢?
在这里插入图片描述
首先我们可以用递归的思想将问题由复杂简单化,如果能先把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个盘子),移动的过程如下:
在这里插入图片描述

发布了27 篇原创文章 · 获赞 10 · 访问量 696

猜你喜欢

转载自blog.csdn.net/m1059247324/article/details/101641206