漢諾塔問題(C語言經典遞歸問題(一))

漢諾塔問題(C語言經典遞歸問題(一))
把A杆上的金盤全部移到C杆上,並仍保持原有順序疊好。
操作規則:
每次只能移動一個盤子,並且在移動過程中三根杆上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一杆上。
漢諾塔問題(C語言經典遞歸問題(一))
思路:
漢諾塔問題(C語言經典遞歸問題(一))
圖解:
漢諾塔問題(C語言經典遞歸問題(一))
示例:
當有兩個盤a,b時
漢諾塔問題(C語言經典遞歸問題(一))
示例:
當有三個盤a,b,c時
漢諾塔問題(C語言經典遞歸問題(一))
算法分析(遞歸算法):














   實現這個算法可以簡單分爲三個步驟:

    (1) 把n-1個盤子由A 移到 B;

    (2) 把第n個盤子由 A移到 C;

    (3) 把n-1個盤子由B 移到 C;

從這裏入手,在加上上面數學問題解法的分析,我們不難發現,移到的步數必定爲奇數步:

    (1)中間的一步是把最大的一個盤子由A移到C上去;

    (2)中間一步之上可以看成把A上n-1個盤子通過藉助輔助塔(C塔)移到了B上,

    (3)中間一步之下可以看成把B上n-1個盤子通過藉助輔助塔(A塔)移到了C上

遞歸的代碼實現
漢諾塔問題(C語言經典遞歸問題(一))
```#include<stdio.h>
void hanoi(int n, char source, char goal, char temp)
{
if (n == 1)
{
printf("Move %d :from %c to %c\n", n, source, goal); //將第n個盤子從source移動到goal
}
else
{
hanoi(n - 1, source, goal, temp);
//將n-1個盤子藉助goal從source移動到temp











          printf("Move %d :from %c to %c\n", n, source, goal);
 //將第n個盤子從source移動到goal

            hanoi(n - 1, temp, goal, source);
//將n-1個盤子藉助source從temp移動到goal
}

}
int main()
{
int n = 0;
printf("請輸入盤子的個數:");
scanf("%d", &n);




      hanoi(n, 'A', 'B', 'C');//藉助B杆將A中盤移動到C上

     return 0;

}```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章