c語言遞迴呼叫漢諾塔,C語言函式遞迴呼叫漢諾塔問題

2021-12-19 05:47:48 字數 3405 閱讀 3598

1樓:雨後陽光的味道

遞迴演算法的出發點不是由初始條件出發,而是把出發點放在求解的目標上,從所求的未知項出發逐次呼叫本身的求解過程,直到遞迴的邊界(即初始條件)。

漢諾塔問題的重點是分析移動的規則,找到規律和邊界條件。

若需要將n個盤子從a移動到c就需要(1)將n-1個盤子從a移動到b;(2)將你第n個從a移動到c;(3)將n-1個盤子再從b移動到c,這樣就可以完成了。如果n!=1,則需要遞迴呼叫函式,將a上的其他盤子按照以上的三步繼續移動,直到達到邊界條件n=1為止。

思路清楚了,程式就好理解了。程式中的關鍵是分析好每次呼叫移動函式時具體的引數和對應的a、b、c塔的對應的關係。下面來以實際的例子對照程式進行說明。

①move(int n,int x,int y,int z)

②//此句有必要用嗎?感覺可以去掉的吧

⑩ move(n-1,y,x,z);}}

比如有4個盤子,現在全部放在a塔上。盤子根據編號為1、2、3、4依次半徑曾大。現在要將4個盤子移動到c上,並且是按原順序羅列。

首先我們考慮如何才可以將4號移動到c呢?就要以b為中介,首先將上面的三個移動到b。此步的操作也就是程式中的①開始調入move函式(首次呼叫記為一),當然現在的n=4,然後判斷即③n!

=1所以不執行④而是到⑤再次呼叫move函式(記為二)考慮如何將3個盤移動到b的方法。此處是遞迴的呼叫所以又一次回到①開始調入move函式,不過對應的引數發生了變化,因為這次要考慮的不是從a移動4個盤到c,而是要考慮從a如何移動移動3個盤到b。因為n=3,故不可以直接移動要藉助c做中介,先考慮將兩個移動到c的方法,故再一次到⑤再一次遞迴呼叫move函式(記為三)。

同理兩個盤還是不可以直接從a移動到c所以要以b為中介考慮將1個移動到b的過程。這次是以b為中介,移動到c為目的的。接下來再一次遞迴呼叫move函式(記為四),就是移動到b一個,可以直接進行。

程式執行③ ④句,程式跳出最內一次的呼叫(即跳出第四次的呼叫)返回上一次(第三次),並且從第三次的呼叫move函式處繼續向下進行即⑧,即將2號移動到了c,然後繼續向下進行到

⑩,再將已經移到b上的哪一個移回c,這樣返回第二次遞迴(以c為中介將3個盤移動到b的那次)。執行⑧,將第三個盤從a移動到b,然後進入⑩,這次的呼叫時因為是將c上的兩個盤移到b以a為中介,所以還要再一次的遞迴呼叫,對應的引數傳遞要分析清楚,誰是原塔誰是目標塔,誰是中介塔。過程類似於上面的分析,這裡不再重複論述了。

不知道講解清楚了沒有,自己看書時感覺關鍵的地方在於函式引數的傳遞,引數和變數的對應關係對應清楚以後就可以了。

希望對你有所幫助,同時也祝你的問題早日得到解決,呵呵!

2樓:翡翠翔

用斷點看程式運**況應該是最好的選擇

在每一行都設一個斷點,按f9

然後按f5執行

每執行一步都注意左下角當前變數的值的變化

從而一步步瞭解程式的運**況

3樓:匿名使用者

//**如下:

//說明:a,b,c為三個載體,起始,中間,目的載體為相對的,

//1.將n-1個盤子從起始載體通過目的載體,移動到中間載體

//2.只有最後一個盤子了.你需要將最後一個盤子從起始載體移到目的載體即可

//3.再將n-1個盤子從剛才的中間載體通過起始載體移動到目的載體.完成

//4.在遞迴時遇到只有1個盤子那直接從起始介質移到目的介質就ok了.

//自己用紙畫畫吧,不太好理解.明白了就不難了.

#include

#define diska "a"

#define diskb "b"

#define diskc "c"

void move(int num,char *fromp,char *mediump,char *top);

void mv(char *fp,char *tp);

int main()

void move(int num,char *fromp,char *mediump,char *top)

else

}void mv(char *fp,char *tp)

4樓:夏雨蕭然

這個,你最好找一張很大的紙,自己去畫一下。數要小一些,不然會很發雜。具體過程不過是函式呼叫自身的過程。

c語言函式遞迴呼叫漢諾塔問題

5樓:谷歌地

#include

void move(int n,char a,char b,char c)

}main()

6樓:

這個遞迴根本就不需要運算,如果你非要理解成一定要有運算的話,那他那個輸出就算是運算了,只是遞迴呼叫的時候是根據上一層遞迴而改變的,主要還是你要理解這個演算法的邏輯過程,而不是糾結於怎麼運算,在紙上一步一步演算一下你就會懂得。

7樓:朝陽

先呼叫一次hanoi(m,'a','b','c'),其中引數m是你輸入的值.

如果你輸入的m為1,則直接呼叫move(one,three),然後直接輸入 a-->c換行

如果你輸入的m不為1,假設為2,則執行過程如下

執行一次hanoi(1,one,three,two),執行 move(one,three),然後直接輸出a-->b換行

執行一次move(one,three),然後直接輸出 a-->c換行

執行一次hanoi(1,two,one,three),執行move(one,three),然後直接輸出b-->c換行

如果你輸入的數字》2那就相應的進入到更多層的hanoi()函式中迴圈

8樓:聽不清啊

void move ( char x, char y )    //完成一個盤子從x 移到 y

9樓:清蓮玉

move函式有實際作用啊。

c語言 漢諾塔 函式遞迴呼叫

10樓:聽不清啊

void move ( char x, char y )    //完成一個盤子從x 移到 y

11樓:朝陽

先呼叫一次hanoi(m,'a','b','c'),其中引數m是你輸入的值.

如果你輸入的m為1,則直接呼叫move(one,three),然後直接輸入 a-->c換行

如果你輸入的m不為1,假設為2,則執行過程如下

執行一次hanoi(1,one,three,two),執行 move(one,three),然後直接輸出a-->b換行

執行一次move(one,three),然後直接輸出 a-->c換行

執行一次hanoi(1,two,one,three),執行move(one,three),然後直接輸出b-->c換行

如果你輸入的數字》2那就相應的進入到更多層的hanoi()函式中迴圈

c語言函式遞迴呼叫的問題,C語言函式遞迴呼叫問題。

首先要知道fun 是一個定義的函式 fun a 相當於fun 3 由下面的函式定義得出fun 3 又fun 2 再求fun 0 因為0不滿足if裡的條件,所以不執行fun 1 所以是0120,希望樓主看明白 先呼叫fun 3 fun 3 中呼叫fun 2 fun 2 中呼叫fun 1 fun 1 中...

c語言題目(函式呼叫),C語言題目(函式呼叫)

a宣告時形參名可以忽略也可以任意合法的變數名,但是其型別不能忽略。以上的講,可能你不好理解,我來告訴你吧 a型別必須要一樣,而且數量一定要相同,宣告形參可以寫也可以不寫 bc語言中,在宣告函式的時候其形式引數可以只是資料型別不用寫出具體的識別符號,如果要寫出具體的識別符號的話,就一定要和函式定義的識...

C語言中函式呼叫問題,C語言中函式的呼叫

首先我們來說一下,你這個程式是有很大的問題的。函式有且只有唯一一個返回值,當程式執行到return的時候,這個函式就結束並返回了。所以,你這裡寫2個return來返回最大值和最小值是不可能的。再者,如果你想使用返回值作為最大值,最小值的傳遞,那麼在main函式中,你呼叫star函式的時候需要一個變數...