c語言函式遞迴呼叫問題(請高手幫忙詳細解釋)

2022-02-14 13:24:52 字數 5390 閱讀 2284

1樓:誰讓我揩油

如果只有一個盤,直接把它從one移到three位置;若有n個盤,就假設有n-1個可以知道怎麼移,那麼把上邊n-1個盤從one移到two位置,再把最底第n個盤從one移到three位置,最後把其餘n-1個從two移到three位置。問題就解決了。

對於n-1可以依靠n-2解決,以此類推,直到2個盤時可以依靠1個盤的解決方法,到1個盤時,已經給出瞭解決方法。這就是遞迴的思想,類似於數學的歸納法。

2樓:

確實,初學c的時候,漢諾塔的遞迴看起來確實是比較神奇的程式。

其中主要就在hanoi 這個遞迴函式,傳的引數裡面有一個n 代表是幾層遞迴。

如果n=1 代表只有一個,move(one,three); 就是把第一個移到第三個就行了。否則

第一個柱子上有n個(n>1) 要移到第三個。需要把上面的n-1個移到第二個,最下面的一個移到第三個,再把第二個柱子上的n-1個移到第三個。 要這三個步驟。

其中,第一個,和第三個步驟,和本身其實是一樣的。

就是把n-1個移到第二個,注意hanoi的引數

/* 定義hanoi函式,將n個盤從one座藉助two座,移到three座 */

two 即第二個引數,這是表示用來藉助的

就假設n=2 吧 hanoi(2,'a','b','c'); 變成了

hanoi(1,a,c,b); //這個代表a座上有一塊,需要藉助c座,移到b座

a--->c

hanoi(1,b,a,c); //這個代表b座上有一塊,需要藉助a座,移到c座

最後會輸出

a-->b

a-->c

b-->c

假設n=3 hanoi(3,'a','b','c');

hanoi(2,a,c,b); //這個代表a座上有兩塊,需要藉助c座,移到b座

a--->c

hanoi(2,b,a,c); //這個代表b座上有兩塊,需要藉助a座,移到c座

a座上有兩塊,需要藉助c座,移到b座 會輸出

a-->c

a-->b

c-->b

b座上有兩塊,需要藉助a座,移到c座 會輸出

b-->a

b-->c

a-->c

c語言函式遞迴呼叫習題,求答案解析

3樓:匿名使用者

f(6) ---> f(3) ;輸出6f(3) ---> f(1) ;輸出3f(1) ---> 輸出1 你倒著把函式替換成結果輸出1;輸出3;輸出6 所以結果就是136

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

4樓:天涯海角

c語言函式呼叫整個過程是當準備呼叫函式時,先將形參以從右往左進行壓棧程式跳轉到函式入口,將函式的區域性變數壓棧(如果函式內部再呼叫函式就是在重複這個過程),函式返回時出棧,遞迴是在最後一個點上面函式返回,前面分配的資源根本沒有釋放,遞迴只有在最後一個返回點上面,根據遞迴順序反過來釋放資源,這也是為什麼當遞迴的資料量比較大或者遞迴的層次比較深的時候,很容易造成記憶體溢位的原因

5樓:豐又青

首先系統執行c語言程式是有個棧和堆的

遞迴過程主要用到了棧

棧的原理是先進先出,相當於摞盤子,我只能拿走最上面的那個系統執行函式時會把函式壓入棧裡

遞迴的過程就是利用這點,把函式壓入棧中,但是這個函式的結果需要執行另一個函式,再繼續壓入棧中,知道出現遞迴出口,就是最後一個函式有了結果

開始**,一個一個出棧,跟樓主的結論2差不多

c語言 程式設計題 使用函式遞迴呼叫編寫n!(階乘)——高手請導啊!

6樓:匿名使用者

#include

void main()

float fac(int n)

else

if(n==0||n==1)

f=1;

else

f=fac(n-1)*n;

return(f);}

7樓:

#include

int di(int n)

int main()

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

8樓:

我一步步的給你講,就會懂啦:

首先hanoi函式如果把當中的move函式給去掉,就變成了:

void hanoi(int n, char one , char two, charthree)

}也就是把move(one,three),變成了printf("%c->%c\n", one, three);。少了一個函式,更加清晰

所以這裡的hanoi函式就有了執行的內容:printf

下面以3個盤子為例進行模擬計算機的執行過程:

1、hanoi(3,a,b,c),開始了這步,進入第一層函式,計算機在函式中會進行自我的再次呼叫(第7行**)

2、(第7行):hanoi(2,a,c,b),於是這又是一個新的hanoi函式,這裡我把它成為第二層函式

同樣執行到第7行,卡住了,再次一次自我的呼叫

3、(進入第三層函式):hanoi(1,a,b,c),這裡的第三層n=1,所以在第四行就顯示出了"a->c",至此,第三層函式結束,回到呼叫他的第二層函式

4、在第二層當中,繼續第8行的內容,所以顯示出"a->b",繼續執行,到第9行,開始了有一次自我呼叫

5、把她稱為貳號第三層函式吧。。。hanoi(1,b,a,c),和第3步類似,這一層函式顯示出了"b->c",然後結束函式,返**用它的第二層函式

6、第二層函式執行完畢,返**用它的第一層函式

7、第一層函式中執行到第8行,顯示出"a->c",然後執行第9行:hanoi(2,b,a,c)

............

如果看到了這裡理清楚了關係就會懂啦,接下來還有一半,如果都寫下來就太複雜了-。-

你所說的空函式是指沒有返回值,但是這裡利用的是電腦呼叫函式的那種關係來解決的問題,比如上面的3步,會自動返回到第二層函式並繼續

還可以這樣理解漢諾塔,漢諾塔其實是將複雜的問題簡單化,

先不管他有多少個盤子從a到c,我只把它視作3步

就像上面那樣找個例子,反覆的按照**模擬計算機執行,過個五次六次,就會懂啦

9樓:谷歌地

#include

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

}main()

10樓:匿名使用者

這個程式是一個遞迴程式,並不是直接出結果的,我簡單解釋下好了

首先你要明白函式呼叫過程,比如:

……fun();

a++;

……在這個例子中,fun結束了會執行a++這種語句,這點沒問題吧。遞迴函式會重複呼叫同名的函式,但是不代表退出了一個同名函式就直接退出了整個函式,而是一層層的返回的。

//取n=3

hanoi(3,'a','b','c');//main中呼叫

hanoi(2,'a','c','b');//n=3,執行else

hanoi(1,'a','b','c');//n=2,執行else

move('a','c');//n=1,執行if,完畢後return到呼叫出執行下一句

move('a','b');//else中第二句

hanoi(1,'c','a','b');//else中第三句

move('c','b');//返**用處,但hanoi(2,'a','c','b')也執行完畢,繼續返回

move('a','c');

hanoi(2,'b','a','c');

hanoi(1,'b','c','a');

move('b','a');

move('b','c');

hanoi(1,'a','b','c');

move('a','c');

//返回至hanoi(1,'a','b','c');

//返回至hanoi(2,'b','a','c');

//返回至main中呼叫hanoi(3,'a','b','c');

遞迴雖然有點抽象,但還是按照函式呼叫的規則的,都是呼叫,結束返回到呼叫處。剛開始都是過程,直到遇到了遞迴結束條件,才結束遞迴呼叫的過程

你這裡的遞迴函式並不是你說的空函式,你仔細看下在這個函式執行過程中,肯定有某些語句是起作用的,你這裡就是move起作用了,你仔細理解下

11樓:

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

12樓:朝陽

先呼叫一次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()函式中迴圈

13樓:聽不清啊

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

14樓:清蓮玉

move函式有實際作用啊。

c語言 函式遞迴呼叫是怎麼回事?

15樓:匿名使用者

一般來說是自己呼叫自己,一般有兩個分支,一個分支是呼叫自己,還有一個分支是結束條件

如求n!

int f(int n)

還有一個比較複雜一點,是雙向呼叫,也就是a函式呼叫b函式,b函式在呼叫a函式

這樣迴圈呼叫,其實基於這個道理,還有多個函式互相呼叫,不過這樣的情況很少見

但萬變不離其宗,每個函式都有兩個分支,一個是結束條件,一個是呼叫函式

16樓:匿名使用者

遞迴呼叫是一種特殊的巢狀呼叫,是某個函式呼叫自己,而不是另外一個函式。但是呼叫的時候肯定有一個終止條件,退出遞迴呼叫。

17樓:匿名使用者

函式自己呼叫自己,或兩函式互相巢狀。

18樓:匿名使用者

自己呼叫自己就是遞迴,資料結構中的樹遍歷可以用遞迴實現。

c語言遞迴求階乘,c語言怎麼用遞迴呼叫函式的方法求n的階乘?

舉例 用遞迴方法求n include int main int n int y printf input a integer number scanf d n y fac n printf d d n n,y return 0 int fac int n int f if n 0 printf n ...

c語言函式遞迴的理解,C語言函式遞迴的理解

對於遞迴,我大致引用一位計算機競賽教練的話 皇帝傳近臣 幫我算一下1 2 3等於多少 然後近臣傳太監 幫我算一下2 3等於多少 太監回近臣 2 3 5 然後近臣回皇帝 1 2 3 1 5 6 這裡每個人為一次函式呼叫。即是說 從頭探到尾,在尾處找到答案後,再回傳給頭。c語言遞迴呼叫的理解 所謂遞迴,...

關於C語言被呼叫函式的宣告問題!高手都進來看一下哈

不同編譯器處理不同的。在vc 6.0環境下,如果返回型別是int型別確實可以不宣告,你的程式可以無誤通過。但是建議只要用到自定義函式都宣告下,於人於己都方便 include include int strin len char str void main 這樣就不用在main 中宣告 因為程式由上至...