????????漢諾塔(Tower of Hanoi),又稱河內塔,是一個源于印度古老傳說的益智玩具。傳說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
求解思路:
三根柱子(標記為 A、B、C),在柱子 A 上有從小到大疊放的n個圓盤,要將這n個圓盤從柱子 A 借助柱子 B 全部移動到柱子C上,移動過程中需要遵循以下規則:
1.每次只能移動一個圓盤。
2.大圓盤不能放在小圓盤上面。
代碼實現及解析:
#include <stdio.h>//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可printf("%c->%c ", src, dest);return;}hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midprintf("%c->%c ", src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟后文的代碼的區別在于,在n==1時,如果不執行return語句終止函數,就會依次執行后面三行代碼(我們不希望執行后面三行代碼)。而后文那個代碼形式,如果n==1,else里面的代碼就不執行了。
補充上面代碼中“void hanoi(int n, char src, char mid, char dest)”函數中的return語句的解釋:
????????void函數明確表示該函數不返回任何值。
1. 核心規則
????????在C語言中,將一個函數的返回類型聲明為?void
,就是告訴編譯器和程序員:“這個函數執行一些操作,但不會產生一個可供使用的返回值。” 因此,在?void
?函數中使用?return
?語句來返回一個值是非法的,會導致編譯錯誤。
2.?return
?語句在?void
?函數中的用法(可選)
????????雖然不能返回一個值,但你仍然可以在?void
?函數中使用?return
?語句。它的作用不再是返回值,而是立即終止函數的執行,提前從函數中退出。
這在某些條件下提前結束函數執行的場景中非常有用。
更多代碼實現(功能一樣,代碼有細微區別):
#include <stdio.h>//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可printf("%c->%c ", src, dest);}else{hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midprintf("%c->%c ", src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟前文的代碼的區別在于,如果n==1,else里面的代碼就不執行了。前文那個代碼形式,在n==1時,如果不執行return語句終止函數,就會依次執行后面三行代碼(我們不希望執行后面三行代碼);
#include <stdio.h>void move(char from, char to)
{printf("%c->%c", from, to);
}//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{ //src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可move( src, dest);}else{hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midmove(src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}