關於C++的遞歸(以漢諾塔為例)


  關於C++,hanoi塔的遞歸問題一直是個經典問題,我們學習數據結構的時候也會時常用到,

因為它的時間復雜度和空間復雜度都很高,我們在實際的應用中不推薦使用這種算法,移動n個盤子,

需要2的n次冪減一步,例如:5個盤子,31步;10個盤子,1023步。

  下面,是我整理的有關C++遞歸的代碼實現過程,希望對大家的學習有所幫助。

  1. #include <iostream>  
  2. using namespace std;
  3. //第一個塔為初始塔,中間的塔為借用塔,最后一個塔為目標塔  
  4. int step=1;//記錄步數  
  5. void move(int n,char from,char to) //將編號為n的盤子由from移動到to  
  6. {
  7. cout<<"第 "<<step++<<" 步:將"<<n<<"號盤子"<<from<<"--------"<<to<<endl;
  8. }  
  9. void hanoi(int n,char from,char denpend_on,char to)//將n個盤子由初始塔移動到目標塔(利用借用塔)  
  10. {  
  11.     if (n==1)  
  12.     move(1,from,to);//只有一個盤子是直接將初塔上的盤子移動到目的地  
  13.     else  
  14.     {  
  15.       hanoi(n-1,from,to,denpend_on);//先將初始塔的前n-1個盤子借助目的塔移動到借用塔上  
  16.       move(n,from,to);              //將剩下的一個盤子移動到目的塔上  
  17.       hanoi(n-1,denpend_on,from,to);//最后將借用塔上的n-1個盤子移動到目的塔上  
  18.     }  
  19. }  
  20. int main()  
  21. {  
  22.      cout<<"請輸入盤子的個數:"<<endl;  
  23.      int n;  
  24.      scanf("%d",&n);  
  25.      char x='A',y='B',z='C';  
  26.     cout<<"盤子移動過程如下:"<<endl;  
  27.      hanoi(n,x,y,z);  
  28. return 0;
  29. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM