讀書筆記---遞歸

  這段時間總是看到遞歸,認真研究後,我感受遞歸的思想十分獨特,也十分常見。它是將某個問題分解成許多類似的問題,而後不斷重複這個過程。而妙就妙在這個重複的過程當中能夠有許多分叉,經典的例子即是n階Hanoi塔問題。數據結構

  

  Hanio塔問題:假設有三個分別命名爲X,Y,Z的塔座,在塔座X上插有n個直徑大小各不相同、依小到大編號爲1,2,3,...,n 的圓盤。現要求將X軸上的n個圓盤移至塔座Z上並仍按一樣順序疊排,圓盤移動時必須遵循下列規則:spa

    (1) 每次只能移動一個圓盤;code

    (2) 圓盤能夠插在X,Y,和Z中的任一塔座上;blog

    (3) 任什麼時候刻都不能將一個較大的圓盤壓在較小的圓盤之上。遞歸

  求搬動次數。io

則其標準解法爲(嚴蔚敏 數據結構 P55):class

 1 void hanoi(int n,char x,char y,char z)
 2 //將塔座x上按直徑由小到大且自上而下編號爲1至n的n個圓盤按規則搬到
 3 //塔座z上,y可用做輔助塔座
 4 //搬動操做move(x,n,z)可定義爲(c 是初值爲0的全局變量,對搬動計數):
 5 //printf("%i.move disk %i from  %c  to  %c\n",++c,n,x,z); 
 6 {
 7     if(n==1)
 8         move(x,1,z);        //將編號爲1的圓盤從x移到z
 9     else{
10         hanoi(n-1,x,z,y);    //將x上編號爲1至n-1的圓盤移到y,z作輔助塔
11         move(x,n,z);        //將編號爲n的圓盤從x移到z
12         hanoi(n-1,y,x,z);    //將y上編號爲1至n-1的圓盤移到z,x作輔助塔 
13     } 
14 }

  這段代碼中,在else語句中分叉成兩部分,將y上的圓盤移到z。然後並不考慮具體操做。變量

  因此,對於遞歸的理解是:對於一個有多個重複操做的問題,考慮其最後一步或幾步操做,然後將問題不斷削減,直至最後一步或最後幾步。而在這個過程當中,能夠有分叉。nio

相關文章
相關標籤/搜索