每週一演算法(1):漢諾塔
阿新 • • 發佈:2018-11-25
首先漢諾塔是使用遞迴一個非常經典的例子,
歷史故事說了也沒用,我們想象原理。
前提,三根柱子ABC,將A上的盤子數按順序挪到C,每次只能一個
1. 一個盤子,A->C
2. 兩個盤子 A->B, A->C, B->C
3. 大於兩個盤子,那我們先理解為上面一個盤子,下面n-1個盤子屬於一個整體。
先移動第一個的A->C,那麼我們在n-1(可以當成1個)需要先將A->B, 然後B->C,
即以下程式碼:
void hanoi(int n, char A, char B, char C) { if (n == 1) { printf("Move sheet %d from %c to %c\n", n, A, C); } else{ hanoi(n - 1, A, C, B); printf("Move sheet %d from %c to %c\n", n, A, C); hanoi(n - 1, B, A, C); } } int main(int argc, char* argv[]) { int n; while (1) { printf("input:"); scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); } }