漢諾塔問題(遞歸)

今天看了漢諾塔問題,在一本書上簡單了看了個大概,沒有深入的瞭解。先記上。


#include<stdio.h>
/*
	漢諾塔問題。
	有n個盤子,有三根石柱,n個盤子從上到下依次爲從小到大的盤子,而且在第一個石柱上面,
	問題:把一個石柱上面的盤子移到第三個上面,而且一次只能移動一個,移動時小盤子必須
	放在大盤子上面。求最後移動的整個過程,和 
	  
	
	我們把n個盤子從A柱移動到C柱,問題可以變爲: 
	Hanio(n,A,B,C)
	該問題可以分解爲以下子問題:
	第一步:將n-1個盤子從A柱移動至B柱(藉助C柱爲過渡柱)
	第二步:將A柱底下最大的盤子一定至C柱
	第三步:將B柱的n-1個盤子移至C柱(藉助A柱爲過渡柱) 
	
	 
	 最後的步數爲:(2^n)-1 
*/
int i;//記錄步數 

//表示進行的步數,將編號爲n的盤子由from柱移動到to柱(目標柱) 
void move(int n,char from,char to){
	printf("第%d步,將%d號盤子%c--->%c\n",i++,n,from,to); 
} 

//漢諾塔遞歸函數 
void Hanio(int n,char pos_start,char pos_trans,char pos_end){
	
	
	//當n=1時,表示就有一個盤子,直接從起始柱移動到目標柱上面 
	if(n == 1){
		move(n,pos_start,pos_end);
	}else{
		// 遞歸開始,我們要把最大的一個盤子移動到第三個柱子上面,n-1個盤子 在第二個盤子上面,所以此時第三個爲過渡柱
		//所以把pos_trans放到第三個位置,pos_end放到第二個位置。 
		Hanio(n-1,pos_start,pos_end,pos_trans);
		move(n,pos_start,pos_end);
		//這是第一個柱子爲空,變爲過渡柱,最後一個柱子上面放着最大的盤子 
		Hanio(n-1,pos_trans,pos_end,pos_start);
	}
}

int main(){
	i = 1;
	Hanio(4,'1','2','3');
	printf("最後總共的步數是:%d\n",i-1);
}


執行結果如下:




發佈了101 篇原創文章 · 獲贊 15 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章