關於C++,hanoi塔的遞歸問題一直是個經典問題,我們學習數據結構的時候也會時常用到,
因為它的時間復雜度和空間復雜度都很高,我們在實際的應用中不推薦使用這種算法,移動n個盤子,
需要2的n次冪減一步,例如:5個盤子,31步;10個盤子,1023步。
下面,是我整理的有關C++遞歸的代碼實現過程,希望對大家的學習有所幫助。
- #include <iostream>
- using namespace std;
- //第一個塔為初始塔,中間的塔為借用塔,最后一個塔為目標塔
- int step=1;//記錄步數
- void move(int n,char from,char to) //將編號為n的盤子由from移動到to
- {
- cout<<"第 "<<step++<<" 步:將"<<n<<"號盤子"<<from<<"--------"<<to<<endl;
- }
- void hanoi(int n,char from,char denpend_on,char to)//將n個盤子由初始塔移動到目標塔(利用借用塔)
- {
- if (n==1)
- move(1,from,to);//只有一個盤子是直接將初塔上的盤子移動到目的地
- else
- {
- hanoi(n-1,from,to,denpend_on);//先將初始塔的前n-1個盤子借助目的塔移動到借用塔上
- move(n,from,to); //將剩下的一個盤子移動到目的塔上
- hanoi(n-1,denpend_on,from,to);//最后將借用塔上的n-1個盤子移動到目的塔上
- }
- }
- int main()
- {
- cout<<"請輸入盤子的個數:"<<endl;
- int n;
- scanf("%d",&n);
- char x='A',y='B',z='C';
- cout<<"盤子移動過程如下:"<<endl;
- hanoi(n,x,y,z);
- return 0;
- }
