初探遞歸(求解漢諾塔)

初探遞歸(求解漢諾塔)

有,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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章