仔細看一下 5-7行調(diào)用 move 時候的參數(shù)順序, 不是你說的那樣沒有變:
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的頭屯河網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
#5 的含義是將 A 上的前 n-1 個移動到 B
#6 : 將 A 最后一個移動到 C
#7: 將 B 上的 n-1 (即#5 從 A 移動過來的 n-1) 個移動到 C
這是個遞歸問題。主函數(shù)很簡單,不說了,關鍵是那個遞歸函數(shù):這里有四個參數(shù),第一個表示移動的盤子個數(shù),這里可以通過鍵盤來輸入。(全部移動64個盤子需要的時間很長,千萬不要輸入太大的數(shù)。)
x,y,z表示三根柱子。
注意參數(shù)中X,Y,Z的順序,x表示原來的柱子,y表示在移動過程中中間過度的柱子,而z標志最后放置的柱子。下面的調(diào)用和這個次序有很大關系。
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--%c\n",x,z);
這個最簡單,如果只有一個盤子(n=1),那么只要從x柱子直接移動到z柱子就可以了。不需要中間以哦的那個其他的盤子。
如果要移動的盤子不止一個,那么就要采取一定的策略。這個策略就是先把上面的n-1個盤子移動到中間的柱子,也就是y,然后把最地下一個盤子移動到z柱子,然后再把中間柱子y上的盤子通過哦a柱子移動到z柱子上。
else
{
move(n-1,x,z,y);//把上面的n-1個盤子通過z柱子移動到y(tǒng)柱子上,這樣才能把最后一個盤子移動到z柱子上。
printf("%c--%c\n",x,z); //輸出這次移動
move(n-1,y,x,z); //然后再把剛才移動出來放在y柱子上的n-1個盤子移動到z柱子上。
}
}
漢諾塔
#include stdio.h
int yd(char a,char b,char c,int n)
{
static int t=0;
if (n==2)
{
printf("%c-%c\n%c-%c\n%c-%c\n",a,c,a,b,c,b);
t=t+3;
}
else
{
yd(a,c,b,n-1);
printf("%c-%c\n",a,b);
t++;
yd(c,b,a,n-1);
}
return t;
}
main()
{
int n;
scanf("%d",n);
printf("%d",yd('a','b','c',n));
}
a.b.c是三個塔,運行后輸入a塔上初始的塊數(shù)。
move(n, A, B) 就表示把第n個餅從A柱移到B柱, 其中step是個全局變量,用來記錄移動的次數(shù)。
hanoi(n, A, B, C) 就是你所問的實現(xiàn)遞歸的函數(shù), 表示把n個餅從A柱通過B柱移到C柱。
其中 n==1 是遞歸的最基本的情況, 如果只有一個餅就直接移到目標柱子即可。
不然呢我們就先把最上面n-1個餅從A通過C移到B,注意這里移到的是B柱哦~, 然后把第n塊餅移到C柱,再重新把之前移到B柱上的n-1個餅通過A移動到C。
整個過程挺直白的,想通了就明白了