調(diào)用過(guò)程就是自己調(diào)用自己,直到滿足退出條件,這個(gè)很重要
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),羅甸網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:羅甸等地區(qū)。羅甸做網(wǎng)站價(jià)格咨詢:13518219792
比如要求5的階乘,先要求4的階乘,接著求3的階乘,。。。最后當(dāng)n=1時(shí),直接return 1
也就結(jié)束了遞歸。其實(shí)很好理解的。。
這段代碼中定義了一個(gè)遞歸函數(shù) fun,函數(shù)的功能是將輸入的參數(shù) x 以二進(jìn)制形式輸出到控制臺(tái)。具體來(lái)說(shuō),函數(shù) fun 的實(shí)現(xiàn)過(guò)程如下:
判斷 x/2 是否大于 0,如果成立,則執(zhí)行下一步操作,否則直接輸出 x 的值。
調(diào)用 fun(x/2-2),即遞歸調(diào)用自身,將 x/2-2 作為新的參數(shù)傳遞給 fun 函數(shù)。
輸出 x 的二進(jìn)制表示。由于在遞歸調(diào)用后,程序會(huì)一直執(zhí)行到當(dāng)前調(diào)用結(jié)束,所以輸出的順序是從最高位到最低位。
根據(jù)上述描述,當(dāng) fun(20) 被調(diào)用時(shí),函數(shù)將按照如下順序執(zhí)行:
fun(20) 調(diào)用 fun(8),輸出 1。
fun(8) 調(diào)用 fun(2),輸出 0。
fun(2) 調(diào)用 fun(0),輸出 1。
fun(0) 直接輸出 0。
因此,最終的輸出結(jié)果為:10100,即二進(jìn)制下的 20。
因此,選項(xiàng) B) 2820 是正確答案。
遞歸函數(shù):
編程語(yǔ)言中,函數(shù)Func(Type a,……)直接或間接調(diào)用函數(shù)本身,則該函數(shù)稱為遞歸函數(shù)。遞歸函數(shù)不能定義為內(nèi)聯(lián)函數(shù)。
在數(shù)學(xué)上,關(guān)于遞歸函數(shù)的定義如下:對(duì)于某一函數(shù)f(x),其定義域是集合A,那么若對(duì)于A集合中的某一個(gè)值X0,其函數(shù)值f(x0)由f(f(x0))決定,那么就稱f(x)為遞歸函數(shù)。
函數(shù)介紹:
在數(shù)理邏輯和計(jì)算機(jī)科學(xué)中,遞歸函數(shù)或μ-遞歸函數(shù)是一類從自然數(shù)到自然數(shù)的函數(shù),它是在某種直覺(jué)意義上是"可計(jì)算的" 。事實(shí)上,在可計(jì)算性理論中證明了遞歸函數(shù)精確的是圖靈機(jī)的可計(jì)算函數(shù)。遞歸函數(shù)有關(guān)于原始遞歸函數(shù),并且它們的歸納定義(見(jiàn)下)建造在原始遞歸函數(shù)之上。但是,不是所有遞歸函數(shù)都是原始遞歸函數(shù) — 最著名的這種函數(shù)是阿克曼函數(shù)。
其他等價(jià)的函數(shù)類是λ-遞歸函數(shù)和馬爾可夫算法可計(jì)算的函數(shù)。
例子:
//代碼1
void func()
{
//...
if(...)
func();
else
//...
}
條件:
一個(gè)含直接或間接調(diào)用本函數(shù)語(yǔ)句的函數(shù)被稱之為遞歸函數(shù),在上面的例子中能夠看出,它必須滿足以下兩個(gè)條件:
1) 在每一次調(diào)用自己時(shí),必須是(在某種意義上)更接近于解;
2) 必須有一個(gè)終止處理或計(jì)算的準(zhǔn)則。
梵塔的遞歸函數(shù):
//C
void hanoi(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z);
else
{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}
相當(dāng)于循環(huán),要有判斷條件,傳遞進(jìn)去的參數(shù)要變化,滿足條件調(diào)用自身,不滿足條件就開(kāi)始一層一層返回。簡(jiǎn)單例子:
int
f(int
i){
int
sum=0;
if(i0)
sum+=f(i-1);
return
sum;
}
main(){
int
a=10;
printf("%d",f(a));
}