c語言函式遞迴問題。一直都弄不清楚遞迴是怎麼執行的,求高手幫我分析遞迴執行過程?(詳細點)

時間 2022-01-25 07:50:54

1樓:星夜落塵

第一次呼叫a(int n)時,n=6:因為n!=1,所以x1=a(6-1)+3=a(5)+3;

接著計算a(5),n=5:如上x2=a(4)+3;

a(4) n=4:x3=a(3)+3;

a(3) n=3:x4=a(2)+3;

a(2) n=2:x5=a(1)+3;

a(1) n=1:此時n=1,x6=13,並且返回x6,即a(1)的返回值為13,逐步向上返回。

所以:x6=13

x5=a(1)+3=x6+3;

x4=a(2)+3=x5+3=x6+2*3;

x3=a(3)+3=x4+3=x6+3*3x2=a(4)+3=x3+3=x6+4*3x1=a(5)+3=x2+3=x6+5*3=13+15=28然後return x1,即a(6)的結果為28.

要注意x是區域性變數,每次呼叫a()函式時的x都是不同的,所以我把它標成了帶1,2,3,4,5序號的x。

2樓:匿名使用者

28=13+3*(6-1);

3樓:匿名使用者

要求的是a(6),不只是a(1)。在呼叫函式中,當a=6時,if(n==1)不成立,執行後面的語句x=a(n-1)+3,即a(6)=a(5)+3。同樣的做法,a(5)=a(4)+3,a(4)=a(3)+3,a(3)=a(2)+3,a(2)=a(1)+3。

而a(1)=13。所以,最後的結果a(6)=3+3+3+3+3+13=28。還有什麼不懂的,可以問我。

c語言中遞迴函式的執行過程?

4樓:匿名使用者

include

int fun(int n)

void main()

當一個問題具有如下特徵時,可用遞迴求解:

1.大問題能分解成若干個子問題;

2.子問題或者是一個定值或者是與大問題具有相同性質的問題;

3.子問題在最小尺度上有直接解,即過程能朝著問題結束的方向發展(遞迴結束條件);

首先,遞迴是通過棧實現的,若沒有遇到結束條件,入棧儲存本次呼叫的返回地址,區域性變數,形式引數等值。

比如計算上面的fun(3)過程:

執行時遇到fun(2),儲存當前的n(n=3)以及fun(2)執行完後的返回地址;然後繼續執行,繼續對區域性變數和函式返回地址入棧儲存。直到遇到遞迴結束條件,開始彈棧,這是將棧頂n域值恢復給n,棧頂地址域作為返回地址出棧,繼續這樣下去,直到棧空,最終所得的n就是所要求得值。

不知道這樣的描述你能不能懂。總之,利用棧的先進先出特性,先往下遞推,遇到結束條件後回溯(彈棧求結果,最後返回),對於地址的相關問題,如果你學組合語言就會懂了。

c語言問題:以下是一個遞迴函式的例子,請幫我分析一下,這段程式是怎麼執行的?值的變化是怎麼樣的?

5樓:

從主函式開始執行,遇到呼叫函式時,直接跳到下面的函式定義中執行,然後把返回值帶到主函式,繼續執行主函式下面的部分。

#include

void main()

int diecheng(int num) \\定義函式

6樓:派派咔咔

進入主函式首先宣告diecheng函式然後列印diecheng(5),進入diecheng函式,num=5,所以result5=5*diecheng(4),進入diecheng(4)result4=4*diecheng(3)進入diecheng(3) result2=3*diecheng(2) 進入diecheng(2) result2=2*diecheng(1),進入diecheng(1) result1=1*diecheng(0),diecheng(0)=1,result1=1;result2=2;result3=6;result4=24;result5=120,所以結果是120

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

7樓:誰讓我揩油

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

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

8樓:

確實,初學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語言函式遞迴問題(含程式)

9樓:

這是一個遞迴函式。

1.你如果輸入的是2,那麼在第一個age(2)裡就會執行else語句,就是再呼叫age(2-1)==age(1),再age(1)裡你知道是咋樣吧,

2.然後age(1)就會傳回10,你記得是age(2)裡的else c=age(n-1)+2呼叫的吧,返回的10就變成了c=10+2呸,如果你輸入5啊啥的就回多激磁遮掩的步驟.

3.這個遞迴歸函式的作用就是輸入n,得到10+2*(n-1).

10樓:匿名使用者

分析:age(int n)

main()

返回值就是整個函式呼叫表示式的值

age(1)=10;/*if(n==1) return c;*/age(2)=age(1)+2;/*else return(age(n-1)+2);*/

計算:age(5)

因為5>1,所以age(5)=age(4)+2;

因為4>1,所以age(4)=age(3)+2;

因為3>1,所以age(3)=age(2)+2;

因為2>1,所以age(2)=age(1)+2;

因為1=1,所以age(1)=10;

一層一層返回就得到age(5)

11樓:匿名使用者

返回到printf中的age(5)。

直接就是age(5)這個句子就是返回值。main函式裡面還應該有函式宣告吧,不然在全部函式外也該宣告的。

這不是函式的遞迴呼叫吧。

12樓:匿名使用者

當n>1 && n<5時,函式返回到c=age(n-1)+2;

這個結果應該是18

遞迴函式用逆推法分析比較有效,即從n=1開始分析到2,到3...

13樓:符淼

遞迴實際就是倒推的過程!

age(int n)

main()

從n=1時到推過去:

當n=1時 c=10 這時執行return語句返回到上一個函式(即n=2)時的那個函式,返回後執行c=10(當n=1時那個函式的返回值)+2 此時再執行return 返回12到上一個函式(即n=3時的函式)以此類推當n=5時則c=18此時再返回到主函式。所以答案為18。

14樓:匿名使用者

樓上的都講得很清楚 我記得這個 潭浩強 的<

15樓:匿名使用者

返回到該函式的呼叫點處

c語言函式遞迴問題

16樓:匿名使用者

首先,我想說的是。在寫程式交流的時候,最好在演算法後邊標註一下演算法所要實現的功能。以便大家交流。

我們從側面來討論這個問題。首先,遞迴呼叫,就是函式在執行的過程中,不斷呼叫他本身。從而達到將問題的求解放到下一步去做。而在最後的退遞迴的過程中,完成整個操作(退遞迴不要求一定理解)

既然是函式呼叫他本身。為了防止無限制的呼叫下去。所以我們在所有遞迴函式的開始處,都要有if語句,來判斷是否當前已經滿足了遞迴的終止條件。

如果是,返回一個確定的值。(如本例中的return 3)

而不滿足終止條件時,我們按照一系列相似的操作,來繼續處理資料。(如本例中的 return x-fun(x-2);

上面這兩條都是必要的。而我們通過分析。在每次x-2的過程中,當主函式呼叫過程中,輸入一個n>0時,最終x-2這一系列操作重複下去,得到的就是0或1。

所以if語句給出了終止條件。基本演算法的要求是可以達到的。

但是此處有一個問題,就是主函式呼叫時,如果引數為-1的話。很明顯不滿足if語句的條件。而且每次-2,最終也不可能滿足終止條件。所以就無限迴圈下去。

這裡的程式健壯性就不好。可能在主函式呼叫時,-1本來就是一個沒有意義的數。但是遞迴演算法不能處理這個資料,就會導致錯誤的發生。

具體解決辦法,請樓主在考慮後,對if語句進行修改,來進行出錯控制。

17樓:

有必要,在x為奇數時x-2的最終遞迴結果是f(1)

偶數時結果為f(0),不會出現f(-1)等情況

除非x傳入負整數

18樓:匿名使用者

如果開始給一個負整數,就是死迴圈了

19樓:匿名使用者

那要看這個遞迴的終止條件是什麼,如果按照你這樣的想法,這個問題是無解的。

c語言小問題為什麼在if後面一直都沒有花括

1 加上大括號相當於一個語句塊,if條件隻影響其後面的第一個語句或語句塊,加括號的話,則執行括號中的全部語句 也就是在if條件成立的情況下,則全部執行,如果if條件不成立,則整個括號中的語句都不執行 而不加括號的話,則影響其後的第一條語句,也就是說不管if條件成不成立,第一句以後的都不會有任何影響。...

一段感情中男的一直都說喜歡女的,可是一直都是女的在付出,男的從來沒有付出過,電話都沒有主動打過

軒港之家 沒必要繼續了,只懂得收穫不懂得付出的,他只是在利用你的感情罷了,如果他是真心喜歡你的,不會一天都不會想起給你 戀愛中的男的,如果真心愛你,他付出的會更多,不會只是口頭的敷衍 如果男的正在開創事業,可以諒解。如果男的只是從事一般工作,那麼男的不是思想有問題,就是人品有問題。 伊謎 嘴上說喜歡...

朋友a 女生 一直都喜歡b,可是b和c在交往,突然b和c分手

答應就是,幸福是靠自己掙取過來的!既然這麼喜歡他,就不要錯過他,等錯過了,就後悔一輩子!即使後面因緣分不夠而分手,也不會懊悔當初的選擇!支援你!不過,話又說回來,看清了事實再行動,假如他們只是鬧下彆扭而已,就沒必要!看那個男的是否是真誠的或是想玩下,再行動。祝君幸福! 年輕人要敢愛敢恨,認為是對的就...