這個(gè)應(yīng)該是計(jì)算階乘的遞歸函數(shù)
專(zhuān)注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)呂梁免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
其實(shí)遞歸函數(shù)的結(jié)構(gòu)很簡(jiǎn)單,一般是兩部分組成
1、判斷是否結(jié)束遞歸。
作用是結(jié)束遞歸調(diào)用,遞歸調(diào)用不可能無(wú)限的調(diào)用下去,要不然成了死循環(huán)了,呵呵
所以要有一個(gè)結(jié)束的條件,如這里的if(n==0||n==1) return 1
2、調(diào)用本身(或者其他函數(shù)(有雙線遞歸和多線遞歸))
這里就是遞歸的本質(zhì)函數(shù)了,他有兩個(gè)地方要注意
1)就是遞歸的公式,以什么條件來(lái)運(yùn)算
這里的公式是遞歸函數(shù)的返回值和參數(shù)相乘
2)就是需要改變函數(shù)的參數(shù),要不然也會(huì)成為死循環(huán)
這里是fac(n-1),這個(gè)n-1就是改變了參數(shù)
多線遞歸和這個(gè)也差不多,只有一個(gè)地方不同,就是調(diào)用的函數(shù)不是本身,是另一個(gè)遞歸函數(shù)
如a調(diào)用b,b在調(diào)用c,c調(diào)用a等等
樓主的程序有兩處錯(cuò)誤,給你修正了一下:
局部?jī)蛇厁沒(méi)有引用,給你刪掉
main函數(shù)沒(méi)有定義類(lèi)型,加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è)沒(méi)用我給你注釋了
}
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é)果
遞歸函數(shù)有三點(diǎn)要求:
1,遞歸的終止點(diǎn),即遞歸函數(shù)的出口
2,不斷的遞歸調(diào)用自身
3,遞歸函數(shù)主體內(nèi)容,即遞歸函數(shù)需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根據(jù)不同的需要合并,比如,有時(shí)候遞歸函數(shù)的主體就是返回調(diào)用下層函數(shù)所得到的結(jié)果。
具體例子如下:
void?fun(int?n)
{
if(n=0)?return;???//1?這是遞歸的終點(diǎn),即出口
fun(n-1);????????//2、遞歸函數(shù)自身的調(diào)用
coutnendl;?????//3?遞歸函數(shù)的主體內(nèi)容
}
2,3合并的情況
int?fun(int?n)
{
if(n=0)?return?0;
return?fun(n-1)+fun(n-2);??//2?3合并
}
遞歸函數(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ù)是一類(lèi)從自然數(shù)到自然數(shù)的函數(shù),它是在某種直覺(jué)意義上是"可計(jì)算的" 。事實(shí)上,在可計(jì)算性理論中證明了遞歸函數(shù)精確的是圖靈機(jī)的可計(jì)算函數(shù)。遞歸函數(shù)有關(guān)于原始遞歸函數(shù),并且它們的歸納定義(見(jiàn)下)建造在原始遞歸函數(shù)之上。但是,不是所有遞歸函數(shù)都是原始遞歸函數(shù) — 最著名的這種函數(shù)是阿克曼函數(shù)。
其他等價(jià)的函數(shù)類(lèi)是λ-遞歸函數(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);
}
}