本文目錄一覽:
- 1、C語言漢諾塔
- 2、c語言漢諾塔.
- 3、c語言 漢若塔的代碼
- 4、C語言漢諾塔程序
C語言漢諾塔
要看懂遞歸程序,往往應先從最簡單情況看起。
先看hanoi(1, one, two, three)的情況。這時直接將one柱上的一個盤子搬到three柱上。注意,這裡one柱或three柱到底是A、B還是C並不重要,要記住的是函數第二個參數代表的柱上的一個盤被搬到第四個參數代表的柱上。為方便,將這個動作記為:
one =》three
再看hanoi(2, one, two, three)的情況。考慮到hanoi(1)的情況已經分析過了,可知這時實際上將產生三個動作,分別是:
one =》two
one =》three
two =》three
很顯然,這實際上相當於將one柱上的兩個盤直接搬到three柱上。
再看hanoi(3, one, two, three)的情況。分析
hanoi(2, one , three, two)
one =》three
hanoi(2, two, one, three)
即:先將one柱上的兩個盤搬到two柱上,再將one柱上的一個盤搬到three柱上,最後再將two柱上的兩個盤搬到three柱上。這不就等於將one柱上的三個盤直接搬到three柱上嗎?
運用歸納法可知,對任意n,
hanoi(n-1, one , three, two)
one =》three
hanoi(n-1, two, one, three)
就是先將one柱上的n-1個盤搬到two柱上,再將one柱上的一個盤搬到three柱上,最後再將two柱上的n-1個盤搬到three柱上。這就是我們所需要的結果!
c語言漢諾塔.
#includestdio.h
void hanoi(int n,char A,char B,char C)
{
if(n==1)
{
printf(“Move disk %d from %c to %c\n”,n,A,C);
}
else
{
hanoi(n-1,A,C,B);
printf(“Move disk %d from %c to %c\n”,n,A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
printf(“請輸入數字n以解決n階漢諾塔問題:\n”);
scanf(“%d”,n);
hanoi(n,’A’,’B’,’C’);
return 0;
}
c語言 漢若塔的代碼
漢諾塔是一種典型的遞歸思想。
以這例子來說,就是如果想把N個盤子從A移到C,就先把最上面的N-1盤子從A移到B,然後把最底邊的盤子移到C, 再把B里的盤子移到C。
這種思想,舉個例子。讓你求1+2+3+。。。。。。+N。
遞歸思想的解法是,如果我知道n-1個數的和,那麼式子的和就是Sn-1 + N;
寫個函數就是:
int sum(int n) {
if (n == 1) {
return 1; // 結束條件,沒有這個條件,函數永遠不會結束。
} else {
return sum(n-1) + n; // n-1個數的和 再加上n
}
}
你要理解了這種思想,就能理解漢諾塔的問題了。
C語言漢諾塔程序
將以下內容全部複製到新建的源文件中:(本人自己寫的,因為你那課本上的代碼,沒解釋,書寫不規範,很難理解清楚,所以我直接新寫了一個完整的代碼,附帶詳細說明)
#include stdio.h
//漢諾塔x層塔從A塔整體搬到C塔,中間臨時B塔。
//x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊
//藉助B塔可以將x層塔全部從A搬到C上,並且符合要求(在移動過程中大的那塊在下邊,小的那塊在上邊)
int main()
{
void tower(int x,char a,char b,char c); //聲明函數
int x=5,a=’A’,b=’B’,c=’C’; //x表示有5層塔,具體要多少層自己修改這個值。abc分別表示ABC塔。
tower(x,a,b,c); //x層塔從a移動到c的全過程,主程序只有這條有效語句
return 0;
}
//以下是tower函數的定義
//參數解析:x層塔放在a上,b是中間塔,c是目標塔。即x層塔要從a搬到c上。
//此函數實現x層塔從a整體轉移到c上。以及這個過程是怎麼搬的全部過程。
void tower(int x,char a,char b,char c)
{
if(x==1)printf(“將%d從%c放到%c\n”,x,a,c); //只有1層塔時,直接從a搬到c上。
else //不止1層塔,則先將x-1層塔從a按照規律搬到b上,再將最後一塊從a搬到c上,最後再將b上的x-1層塔按照規律搬到c上。
{
tower(x-1,a,c,b); //先將x-1層塔從a按照規律搬到b上,注意參數b放在最後,因為放在最後的參數是準備搬過去的目標塔。
printf(“將%d從%c放到%c\n”,x,a,c); //將最後一塊從a搬到c上
tower(x-1,b,a,c); //最後再將b上的x-1層塔按照規律搬到c上,注意參數b放在開頭,因為x-1層是要從b上搬過去的。
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/282895.html