這段時間總是看到遞歸,認真研究後,我感受遞歸的思想十分獨特,也十分常見。它是將某個問題分解成許多類似的問題,而後不斷重複這個過程。而妙就妙在這個重複的過程當中能夠有許多分叉,經典的例子即是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