遞歸與分治---漢諾塔問題

1.如何理解遞歸與分治呢?其主要的思想在於又宏觀到微觀,由整體到個體。

2.不多說,上代碼

#include <iostream>
using namespace std;
//把A上的盤子放到C上 
void Hanoi(int n,char A,char B,char C){
	if(n==1){
		cout<<A<<"-->"<<C<<endl;
	}
	else{
		Hanoi(n-1,A,C,B);//把A上的n-1個盤子通過C放到B上 
		cout<<A<<"-->"<<C<<endl;//把A最下面的盤子放到C上 
		Hanoi(n-1,B,A,C);//再把n-1個B上的盤子通過A放到C上 
	}
}

int main(){
	Hanoi(3,'A','B','C');
	return 0;
} 

3.首先,遞歸最重要的是出口,如上述代碼段的

   if(n==1){
        cout<<A<<"-->"<<C<<endl;//即當盤子數目爲1的時候,直接把A盤子放到C盤子
    }

而當盤子數目爲n時候怎麼辦呢?那就把上面的n-1個盤子看成一個盤子,變成兩個盤子的問題,那麼就好解決了,直接調用Hanoi(n-1,A,C,B)把上面的n-1個盤子先放到C再放到B上,之後還剩下第N個盤子怎麼辦呢,把第N個盤子放到C,然後再把B上面的N-1個盤子放到C上面就行了。所以,主要思想是整體分析問題,因爲整體裏面的小問題都是相同的子問題,沒必要深究,當然,遞歸最最重要的是出口,只要出口寫好了,基本上遞歸程序就完成了!

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