初探递归(求解汉诺塔)

初探递归(求解汉诺塔)

有,X,Y,Z三个轴,要将X轴上的64个盘子从X轴移到Z轴。
对于游戏玩法的分析拆解:
–将X轴上的前63个盘子移到Y轴)。
–将最底下的第64个盘子移到Z轴。
–将Y轴上的63个盘子移到Z轴。
故,现在只需解决新问题:
第一.将X轴上的63个盘子借助Z轴移到Y轴。
第二.将Y轴上的63个盘子借助X轴移到Z轴。
从而再将问题一·二进行拆解:
第一:将x轴上的前62个盘子移到y轴。
将x轴上剩下的一个盘子移到z轴。
将y轴的62个再移到z轴。
第二:将Y轴上的前62个盘子移到x轴。
将y轴上剩下的一个盘子移到z轴。
将x轴的62个再移到z轴。

综上:每步需要留下最底下的一个盘子(需要将之放在目标轴),把上边的盘子想办法移到中间轴。之后将最下边的盘子移到目标轴。再想办法把之前移到中间轴的盘子移到目标轴.
而现在需要解决的问题就是这个办法。而办法就根上方一样的思路。逻辑一样,而用递归(自己调用自己的方法)。
代码如下:

#include<stdio.h>
int hanoi(int n,char x,char y,char z)//n代表目前需要移动多少盘子,x指初始轴,y指中间轴,z指目标轴 
{
	if(n==1){
		printf("%c-->%c\n",x,z);//只需移动一个盘子的时候,直接从初始轴移到目标轴 
	}
	else{
		hanoi(n-1,x,z,y);//调用hanoi函数,将初始盘的n-1个盘子借助目标轴移到中间轴 
		printf("%c-->%c\n",x,z);//将初始化轴最下边一个盘子直接移动到目标轴
		hanoi(n-1,y,x,z); //将移到中间轴的n-1个盘子再借助初始轴移到目标轴 
	}
	return 0;
}
int main()
{
	int n;
	scanf("%d",&n);
	hanoi(n,'A','B','C'); 
	return 0;
}


发布了10 篇原创文章 · 获赞 1 · 访问量 203

猜你喜欢

转载自blog.csdn.net/Huberyxiao/article/details/103448022
今日推荐