c語言中函數(shù)的遞歸調(diào)用 c語言函數(shù)的遞歸調(diào)用怎么理解

C語言函數(shù)遞歸調(diào)用問題?

函數(shù)其實沒有釋放內(nèi)存的概念,因為函數(shù)都是在指令區(qū),而不是通常所說的釋放內(nèi)存對應(yīng)的數(shù)據(jù)區(qū),不過在整個程序執(zhí)行完之后指令區(qū)也是要釋放的。

目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、長寧網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

函數(shù)調(diào)用的大概過程如下:

1,將調(diào)用函數(shù)的上下文入棧;

2,調(diào)用被調(diào)用函數(shù);

3,被調(diào)換函數(shù)執(zhí)行;

4,調(diào)用函數(shù)上下文出棧,繼續(xù)執(zhí)行后繼指令。

所以在函數(shù)調(diào)用過程中原調(diào)用函數(shù)是不會退出的-----即你所說的釋放內(nèi)存。

具體到你給的代碼:

首先main中調(diào)用test,

進(jìn)入test后要求讀入一個char,

你輸入'1'后執(zhí)行case

'1'中語句,所以輸出“已調(diào)用”,然后就執(zhí)行test()語句,即遞歸調(diào)用,此時main調(diào)用的test要等新的test執(zhí)行完畢才能繼續(xù)執(zhí)行后繼的i++語句;

再次進(jìn)入test之后與從main中進(jìn)入時一樣,如果輸入的是'1'會接著遞歸調(diào)用test,由于你輸入了5次1,所以會繼續(xù)調(diào)用5次test;

在最后一個test中你輸入了ESC?

所以不再走case

'1'而走default了,所以輸出"222222";

switch執(zhí)行完之后判斷c==27滿足,所以while循環(huán)退出,繼續(xù)執(zhí)行printf語句,由于之前的test統(tǒng)統(tǒng)沒有執(zhí)行過case

1里的i++語句,所以全局變量i還是0;輸出i=0;

到此最后一次test執(zhí)行完畢;

倒數(shù)第二次的test繼續(xù)執(zhí)行i++,

所以i=2了,case

1執(zhí)行完畢,但由于沒有寫break語句,所以繼續(xù)執(zhí)行default

語句,輸出"222222",

退出switch語句,判斷c==27,

由于c是全局變量,且最后一次輸入的剛好是ESC,

所以判斷滿足,

退出while循環(huán),輸出i=1,

到此倒數(shù)第二次test執(zhí)行完畢;

與倒數(shù)第二次類似的繼續(xù)執(zhí)行倒數(shù)第三、倒數(shù)第四、倒數(shù)第五和最終的第一次test后繼代碼,也就輸出如你列出的結(jié)果了。

C語言函數(shù)遞歸調(diào)用?

第一級遞歸:n=483,i=n/10=48≠0

注意此時先遞歸調(diào)用convert(48),待遞歸返回再輸出當(dāng)前n的個位數(shù)字n%10=3

第二級遞歸:n=48,i=n/10=4≠0

此時繼續(xù)遞歸調(diào)用convert(4),待遞歸返回再輸出當(dāng)前n的個位數(shù)字n%10=8

第三級遞歸:n=4,i=n/10=0

此時遞歸終止,先輸出當(dāng)前n的個位數(shù)字n%10=4

再返回上一級遞歸輸出8,最后返回第一級遞歸輸出3

因此最終輸出為:4 8 3

c語言函數(shù)遞歸調(diào)用

我給你舉個簡單的例子你就明白了,你可以假設(shè)n=3

然后代入這個函數(shù),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

滿意請采納

c語言?函數(shù)遞歸調(diào)用是怎么回事?

一般來說是自己調(diào)用自己,一般有兩個分支,一個分支是調(diào)用自己,還有一個分支是結(jié)束條件

如求n!

int

f(int

n)

{

if(n==1)

//這個是結(jié)束條件

return

1;

else

//這個是調(diào)用自己的分支

return

n*f(n-1);

}

還有一個比較復(fù)雜一點(diǎn),是雙向調(diào)用,也就是a函數(shù)調(diào)用b函數(shù),b函數(shù)在調(diào)用a函數(shù)

這樣循環(huán)調(diào)用,其實基于這個道理,還有多個函數(shù)互相調(diào)用,不過這樣的情況很少見

但萬變不離其宗,每個函數(shù)都有兩個分支,一個是結(jié)束條件,一個是調(diào)用函數(shù)

C語言函數(shù)的遞歸調(diào)用

先調(diào)用函數(shù)f,然后把返回值賦值給z。不過這個函數(shù)不對,沒有退出條件,無法停止。舉例說明吧

int f(int x)

{

if(x==0)

{

return 1;

}

else

{

return x*f(x-1);

}

}

假如f(3)

那么

第一次f(3):x!=0,調(diào)用f(2)

第二次f(2):x!=0,調(diào)用f(1)

第三次f(1):x!=0,調(diào)用f(0)

第四次f(1):x==0,返回1

返回第三次調(diào)用f(1):返回1*1=1;

返回第二次調(diào)用f(2):返回2*1=2;

返回第一次調(diào)用f(3):返回3*2=6;

f(3)的結(jié)果為6

c語言函數(shù)的遞歸調(diào)用?

遞歸有一個堆棧的概念,那就意味著他是一個反理解的過程:就象數(shù)學(xué)遞推一樣,你知道第一項,第二項,又知道通項公式,那你就可以知道任何一項。

然后你看代碼:fun(0)==0,fun(1)==1;是告訴你一二項。

fun(n)==fun(n-1)+fun(n-2);是告訴你通項公式。那么,你就可以知道任何一項。你這樣理解就差不多了,具體機(jī)器是怎么操作的,那很復(fù)雜的,也不需要明白!?。。?/p>

本文題目:c語言中函數(shù)的遞歸調(diào)用 c語言函數(shù)的遞歸調(diào)用怎么理解
轉(zhuǎn)載注明:http://muchs.cn/article4/dooopoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航、云服務(wù)器、網(wǎng)站導(dǎo)航網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)