1. 程式人生 > >C語言:遞迴

C語言:遞迴

使用遞迴最成功的例子:

漢諾塔:有三根相鄰的柱子,標號為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
    }
}