漢諾塔遞歸實現c語言版

#漢諾塔問題 遞歸實現法

話不多說直接上代碼

#include <stdio.h>
void Move(int n ,char from ,char to){
    printf("%c -> %c\n",from,to);
}
void hanoi(int n ,char from,char depend,char to){
    if (n == 1) {
        //當剩一個盤子的時候,直接移動到目的柱
        Move(1, from, to);
    }else{
        hanoi(n-1,from,to,depend);//將初始柱的前n-1個盤子藉助目的塔移動到借用柱上
        Move(n,from,to);              //將剩下的一個盤子移動到目的柱上
        hanoi(n-1,depend,from,to);//將b柱n-1個盤子移動到借用a柱移動到c上
    }
}
int main() {
    int n;
    scanf("%d",&n);
    char x = 'A',y = 'B',z = 'C';
    printf("盤子移動情況如下:\n");
    hanoi(n, x, y, z);
}

思路:
不管多少個盤子(一個盤子的時候除外),全部都看作是兩個盤子
即 最下面的那一個,和其上面的(n-1)個。
這樣兩個盤子的時候,移動就非常簡單了。

總共有三步:
1.將第一個(也就是n-1)個盤子藉助C柱從A柱移動到B柱。
2.將最下面的那一個盤子直接從A柱移動到C柱。
3.最後將B柱的那些(n-1)個盤子藉助A柱移動到C柱。

所以在入口參數的時候需要,起始柱,藉助柱(有點繞口),目的柱。

剛開始可能有些看不太懂,可以先輸入幾個簡單的數,用斷點調試,看一下他的移動過程。
遞歸函數的終點就是隻剩一個盤子的時候,直接移動到目的柱。

如果明白了就不用看我下面的廢話了

假設有64個盤子,那麼問題就成了移動63和最下面的盤子。分成了兩組去完成我上述說的那三步。
接着63個盤子去做第一步時就已經開始了遞歸。
遞歸到下一級時,就意味着再把63個盤子看成一個整體。分成兩部分,最下面的一塊和上面的62塊。去完成這件事,以此類推,直到第一塊。
因爲只有前62塊都完成移動,纔可以移動到第六十三塊。

不要去想着這個過程,很容易繞暈的,只需要知道這個函數的功能就是移動盤子。

***下篇博客寫漢諾塔非遞歸算法,c語言實現。 ***

參考博客
https://blog.csdn.net/csshuke/article/details/82630311

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