C語言:遞迴
阿新 • • 發佈:2019-01-08
使用遞迴最成功的例子:
漢諾塔:有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子C上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動,設移動次數為H(n)。
如果只有一個盤子,那麼我們可以直接將盤子從A移動到C。
如果有兩個盤子,我們可以先把較小的盤子移到B上,把最大的盤子從A移動到C,再把較小的盤子從B移動到C。
如果有三個盤子,我們把上面兩個盤子看作一個整體,把它們通過C移動到B,移為較大的在下小的在上的狀態,把最大的盤子從A移動到C,再把B上的兩個盤子通過A移動到C。
...
以此類推,我們可以可以得到如果有n個盤子時:
我們將上面(n-1)個盤子看作一個整體,把他們通過C移動到B,把最大的盤子從A移動到C,再把B上的(n-1)個盤子通過A移動到C。
實現:
void Move(char x,char y)//模擬一個盤子的移動 { printf("%c->%c\n"x,y); } void Hanoi(int n,char A,char B,char C) { if(n==1) { Move(A,C); } else { Hanio(n-1,A,B,C); //A上的通過C移到B Move(A,C); //A->C Hanio(n-1,B,A,C); //B上的通過A移到C } }