C語(yǔ)言函數(shù)可以自我調(diào)用。如果函數(shù)內(nèi)部一個(gè)語(yǔ)句調(diào)用了函數(shù)自己,則稱這個(gè)函數(shù)是“遞歸”。遞歸是以自身定義的過(guò)程。
連云港網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
這是遞歸運(yùn)算,當(dāng)運(yùn)行到age(n-1)時(shí),會(huì)將n-1的值傳遞到age函數(shù)中再執(zhí)行此函數(shù),此時(shí)age(int n)中的n就等于n-1;下面的依次循環(huán),直到n==1,執(zhí)行順序如下:
n=5時(shí),運(yùn)行到age(4)+2,此時(shí)調(diào)用age(4),
n=4,運(yùn)行到age(3)+2,此時(shí)調(diào)用age(3),
n=3,運(yùn)行到age(2)+2,此時(shí)調(diào)用age(2),
n=2,運(yùn)行到age(1)+2,此時(shí)調(diào)用age(1),
n=1時(shí),c=10,return c 即返回10.現(xiàn)在將10返回到調(diào)用age(2)時(shí)的age(1)+2,即c=age(1)+2
c=12,再return 12,返回到調(diào)用age(3)時(shí)的age(2)+1,c=age(2)+2,此時(shí)c=14,····這樣一直返回到n=5的情況,此時(shí)c=18
}
區(qū)別:
函數(shù)的嵌套調(diào)用是指在一個(gè)C語(yǔ)言函數(shù)里面在執(zhí)行另一個(gè)函數(shù),這樣通常稱為函數(shù)的嵌套調(diào)用。而函數(shù)的遞歸調(diào)用,一般指的是這個(gè)C語(yǔ)言函數(shù)調(diào)用自己本身的函數(shù)也就是說(shuō)調(diào)用函數(shù)的函數(shù)體是一樣的,這樣稱為遞歸調(diào)用。
擴(kuò)展資料:
函數(shù)的分類
從用戶使用的角度看,函數(shù)有兩種:
標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由系統(tǒng)提供的。用戶自定義的函數(shù)??梢越鉀Q用戶的專門需要。
從函數(shù)的形式看,函數(shù)分兩類:
無(wú)參函數(shù)。printstar和print_message就是無(wú)參函數(shù)。在調(diào)用無(wú)參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)傳送給被調(diào)用函數(shù),一般用來(lái)執(zhí)行指定的一組操作。
有參函數(shù)。在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞。也就是說(shuō),主調(diào)函數(shù)可以將數(shù)據(jù)傳遞給被調(diào)用函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來(lái)供主調(diào)函數(shù)使用。
參考資料來(lái)源:百度百科—main函數(shù)
函數(shù)在C語(yǔ)言中是必不可少的一部分,大致可以分為兩種:系統(tǒng)定義好的和我們自己寫的。不管是哪種函數(shù),它們都默默地、兢兢業(yè)業(yè)地完成著屬于自己的任務(wù)。只要給它一些參數(shù),它就會(huì)把參數(shù)處理好、有些函數(shù)還會(huì)把處理結(jié)果返回出來(lái)。以下幾種特殊函數(shù),你有見過(guò)嗎?會(huì)用嗎?
1、靜態(tài)函數(shù)
普通的函數(shù)一般是全局的,可見范圍是跨文件的,比如a.c 這個(gè)文件中有一個(gè)函數(shù)名為 func() , b.c文件 中是可以直接調(diào)用a.c中的func函數(shù)的。而靜態(tài)函數(shù)不同,它被static修飾之后可見范圍縮小到本文件可見,其它文件不可見。
如果真的是閑得蛋疼想在一個(gè)文件中調(diào)用一個(gè)別的文件中的靜態(tài)函數(shù),也有辦法:
1.直接把func所在的函數(shù)包含進(jìn)來(lái) #include "b.c"
2.可以把static 修飾的函數(shù)寫在頭文件中
2、遞歸函數(shù):
這個(gè)名字看起來(lái)有一點(diǎn)數(shù)學(xué)味,比較高級(jí)的樣子。其實(shí)它的定義也很簡(jiǎn)單:在一個(gè)函數(shù)內(nèi)部調(diào)用了自身,那這個(gè)函數(shù)就是遞歸函數(shù)。
下面寫了一個(gè)例子:
使用遞歸函數(shù)的時(shí)候有幾個(gè)問(wèn)題要注意:
1.只有能被遞歸解決的問(wèn)題才可以使用遞歸來(lái)解決。(階乘、冪運(yùn)算、字符翻轉(zhuǎn)等)
2.遞歸函數(shù)中必須有一個(gè)可以直接退出(返回)的條件,否則會(huì)進(jìn)入無(wú)限循環(huán)。
3.遞歸的過(guò)程包含兩個(gè):逐漸遞進(jìn),層層回歸。
4.遞歸函數(shù)會(huì)使用大量的棧內(nèi)存空間,要注意遞歸的層次不要太深,如果一定要用的話可以嘗試把??臻g的大小臨時(shí)設(shè)置一下。(ulimit -s)
3.指針函數(shù)
這種函數(shù)是什么其實(shí)很明顯了,指針函數(shù)就是返回值是指針類型的函數(shù)。
使用的時(shí)候要確保該函數(shù)的返回值是指針,不然編譯器會(huì)報(bào)警告。
4、回調(diào)函數(shù)
函數(shù)的實(shí)現(xiàn)方,它不方便直接調(diào)用該函數(shù),而是由第三方接口來(lái)調(diào)用該函數(shù),該函數(shù)就是回調(diào)函數(shù)。概念有點(diǎn)繞,我們直接看代碼:
可以看到我們?cè)谥骱瘮?shù)main里面并沒有直接調(diào)用func()函數(shù),而是運(yùn)用函數(shù)指針P通過(guò)一個(gè)signal函數(shù)去調(diào)用它。在實(shí)際工程中回調(diào)函數(shù)會(huì)用得比較多,就像圖中的signal函數(shù),假設(shè)這個(gè)函數(shù)是從別人手上買回來(lái)的,我們無(wú)權(quán)訪問(wèn)其源碼,只能夠使用。賣家給我們留下了接口讓我們使用它,因此我給了它兩個(gè)參數(shù),當(dāng)它收到信號(hào)2的時(shí)候,我希望它能幫我調(diào)用我寫的func()函數(shù)。那么func()就是所謂的回調(diào)函數(shù)。
5、內(nèi)聯(lián)函數(shù)
如果有一個(gè)函數(shù)被多次調(diào)用,那么該函數(shù)在調(diào)用過(guò)程中會(huì)消耗程序執(zhí)行的時(shí)間, 而內(nèi)聯(lián)函數(shù)指的就是可以把需要調(diào)用的函數(shù)副本拷貝到調(diào)用者的內(nèi)部,節(jié)約了調(diào)用過(guò)程中的時(shí)間。
普通函數(shù)的調(diào)用與切換過(guò)程:
內(nèi)聯(lián)函數(shù)示意圖:
內(nèi)聯(lián)語(yǔ)法:
什么時(shí)候應(yīng)該用內(nèi)聯(lián)函數(shù):一個(gè)函數(shù)在另一個(gè)函數(shù)多次被調(diào)用,而且被調(diào)用函數(shù)的內(nèi)容比較少的情況。
6、變參函數(shù)
如果一個(gè)函數(shù)的參數(shù)類型以及參數(shù)的數(shù)量都是可變的,那么這個(gè)函數(shù)就稱之為變參函數(shù)(如我們常用的printf)。
函數(shù)形參在棧中分配內(nèi)存的順序,從右到左的獨(dú)特順序使得第一個(gè)參數(shù)是棧頂元素(即示例中的參數(shù) format),我們就可以根據(jù)第一個(gè)已知的參數(shù)(綠色)所提供的線索, 來(lái)回溯剩下的未知的參數(shù)(黃色)
以上六種特殊函數(shù),你看懂了嗎?有任何疑問(wèn)可以評(píng)論區(qū)告訴我哦!
森式嵌入,持續(xù)分享嵌入式硬知識(shí)。歡迎志同道合的朋友關(guān)注一起交流進(jìn)步!
樓主的程序有兩處錯(cuò)誤,給你修正了一下:
局部?jī)蛇厁沒有引用,給你刪掉
main函數(shù)沒有定義類型,加void
#include?stdio.h
void?fun(int?n)
{
int?d,y;//x給你刪掉了
d=n%2;
y=n/2;
if(y!=0)
{
fun(y);
}
printf("%d",d);
//putchar('\n');這個(gè)沒用我給你注釋了
}
void?main()
{
int?n;
printf("enter?a?number\n");
scanf("%d",n);
if(n0)
printf("Input?data?error\n");
else
fun(n);
putchar('\n')//最后才調(diào)用這句代碼
}
下面給你分析一下:
? fun()函數(shù)是一個(gè)遞歸函數(shù),什么意思呢?意思就是它會(huì)調(diào)用本身,每次函數(shù)都會(huì)先執(zhí)行代碼d=n%2;y=n/2;然后在判斷n是否大于0,如果n大于0,函數(shù)繼續(xù)回調(diào),如果n=0,函數(shù)就結(jié)束了回調(diào),整個(gè)程序也就完成了。
? 至于你說(shuō)的執(zhí)行完了這句還會(huì)不會(huì)執(zhí)行后面的printf("%d",d);這是肯定的,因?yàn)橐敵霭?,給你看看運(yùn)行結(jié)果
網(wǎng)站標(biāo)題:c語(yǔ)言函數(shù)遞進(jìn) 函數(shù)與遞歸c語(yǔ)言
轉(zhuǎn)載來(lái)于:http://jinyejixie.com/article26/dodhcjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站改版、網(wǎng)站制作、搜索引擎優(yōu)化、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)