函數其實沒有釋放內存的概念,因為函數都是在指令區,而不是通常所說的釋放內存對應的數據區,不過在整個程序執行完之后指令區也是要釋放的。
目前創新互聯已為上千的企業提供了網站建設、域名、虛擬空間、綿陽服務器托管、企業網站設計、長寧網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
函數調用的大概過程如下:
1,將調用函數的上下文入棧;
2,調用被調用函數;
3,被調換函數執行;
4,調用函數上下文出棧,繼續執行后繼指令。
所以在函數調用過程中原調用函數是不會退出的-----即你所說的釋放內存。
具體到你給的代碼:
首先main中調用test,
進入test后要求讀入一個char,
你輸入'1'后執行case
'1'中語句,所以輸出“已調用”,然后就執行test()語句,即遞歸調用,此時main調用的test要等新的test執行完畢才能繼續執行后繼的i++語句;
再次進入test之后與從main中進入時一樣,如果輸入的是'1'會接著遞歸調用test,由于你輸入了5次1,所以會繼續調用5次test;
在最后一個test中你輸入了ESC?
所以不再走case
'1'而走default了,所以輸出"222222";
switch執行完之后判斷c==27滿足,所以while循環退出,繼續執行printf語句,由于之前的test統統沒有執行過case
1里的i++語句,所以全局變量i還是0;輸出i=0;
到此最后一次test執行完畢;
倒數第二次的test繼續執行i++,
所以i=2了,case
1執行完畢,但由于沒有寫break語句,所以繼續執行default
語句,輸出"222222",
退出switch語句,判斷c==27,
由于c是全局變量,且最后一次輸入的剛好是ESC,
所以判斷滿足,
退出while循環,輸出i=1,
到此倒數第二次test執行完畢;
與倒數第二次類似的繼續執行倒數第三、倒數第四、倒數第五和最終的第一次test后繼代碼,也就輸出如你列出的結果了。
第一級遞歸:n=483,i=n/10=48≠0
注意此時先遞歸調用convert(48),待遞歸返回再輸出當前n的個位數字n%10=3
第二級遞歸:n=48,i=n/10=4≠0
此時繼續遞歸調用convert(4),待遞歸返回再輸出當前n的個位數字n%10=8
第三級遞歸:n=4,i=n/10=0
此時遞歸終止,先輸出當前n的個位數字n%10=4
再返回上一級遞歸輸出8,最后返回第一級遞歸輸出3
因此最終輸出為:4 8 3
我給你舉個簡單的例子你就明白了,你可以假設n=3
然后代入這個函數,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1
所以最后就是a(3)=1+5+5=11…
同理你可以算出a(10)=1+5*9=46
滿意請采納
一般來說是自己調用自己,一般有兩個分支,一個分支是調用自己,還有一個分支是結束條件
如求n!
int
f(int
n)
{
if(n==1)
//這個是結束條件
return
1;
else
//這個是調用自己的分支
return
n*f(n-1);
}
還有一個比較復雜一點,是雙向調用,也就是a函數調用b函數,b函數在調用a函數
這樣循環調用,其實基于這個道理,還有多個函數互相調用,不過這樣的情況很少見
但萬變不離其宗,每個函數都有兩個分支,一個是結束條件,一個是調用函數
先調用函數f,然后把返回值賦值給z。不過這個函數不對,沒有退出條件,無法停止。舉例說明吧
int f(int x)
{
if(x==0)
{
return 1;
}
else
{
return x*f(x-1);
}
}
假如f(3)
那么
第一次f(3):x!=0,調用f(2)
第二次f(2):x!=0,調用f(1)
第三次f(1):x!=0,調用f(0)
第四次f(1):x==0,返回1
返回第三次調用f(1):返回1*1=1;
返回第二次調用f(2):返回2*1=2;
返回第一次調用f(3):返回3*2=6;
f(3)的結果為6
遞歸有一個堆棧的概念,那就意味著他是一個反理解的過程:就象數學遞推一樣,你知道第一項,第二項,又知道通項公式,那你就可以知道任何一項。
然后你看代碼:fun(0)==0,fun(1)==1;是告訴你一二項。
fun(n)==fun(n-1)+fun(n-2);是告訴你通項公式。那么,你就可以知道任何一項。你這樣理解就差不多了,具體機器是怎么操作的,那很復雜的,也不需要明白!!!!
本文題目:c語言中函數的遞歸調用 c語言函數的遞歸調用怎么理解
轉載注明:http://vcdvsql.cn/article4/dooopoe.html
成都網站建設公司_創新互聯,為您提供標簽優化、品牌網站建設、面包屑導航、云服務器、網站導航、網站排名
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯