Tower of Hanoi 簡單易懂的寫法
阿新 • • 發佈:2019-02-02
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的遞迴演算法很簡簡單單:
- 先把個盤子從from放在temp上,
- 把from上剩下的一個盤子(也就是最底下的盤子)放到to上。
- 把temp上的個盤子放到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的遞迴寫法啦。