1. 程式人生 > >Tower of Hanoi 簡單易懂的寫法

Tower of Hanoi 簡單易懂的寫法

在這裡插入圖片描述
Hanoi塔問題的大意是將所有的盤子從最左邊(from)的柱子轉移到最右邊的柱子(to)上,可以藉助中間的柱子(temp)。
而且移動過程中要滿足一下規則:
1:每次只能移動1個圓盤
2:任何時刻都不允許將較大的圓盤壓在較小的圓盤之上

Hanio塔問題是一道經典的遞迴問題了,但是很多人第一次看都會一臉懵逼。因為他們看到的程式碼是這樣的:

#include<stdio.h>
void hanoi(int n,char A,char B,char C)
{
    if (n>0) 
    {
        hanoi(n-1,A,C,B);
        printf("%c→%c\n",A,C);
        hanoi(n-1,B,A,C);
    }
}
int main()
{
    hanoi(3,'A','B','C');    
}

還沒領會到演算法的本質,就已經在ABC的世界中找不到北了。。。
遞迴演算法最大的優點之一就是可讀性性、實現簡單,然而上面的程式碼顯然不是這樣。問題就出在引數命名上,ABC這樣的名字實在是太容易讓人混淆了~
其實Hanoi的遞迴演算法很簡簡單單:

  1. 先把n1n-1個盤子從from放在temp上,
  2. from上剩下的一個盤子(也就是最底下的盤子)放到to上。
  3. temp上的n1n-1個盤子放到to上。

只不過在放的過程中from、to、temp角色會發生變化,但放法都是一樣的。

#include<stdio.h>
void hanoi(int n,char from,char temp,char to)
{
    if(n>0)
    {
        //第一步
        hanoi(n-1,from,to,temp);
        //第二步
        printf("%c move to %c\n",from,to);
        //第三步
        hanoi(n-1,temp,from,to);
    }
}
int main()
{
    hanoi(3,'A','B','C');    
}

只要心中明確hanoi中各個位置引數的含義,就可以掌握hanoi的遞迴寫法啦。