新聞中心
c語言的遞歸函數(shù) 怎么運(yùn)行的?
這個(gè)應(yīng)該是計(jì)算階乘的遞歸函數(shù)
黑山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,黑山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為黑山上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的黑山做網(wǎng)站的公司定做!
其實(shí)遞歸函數(shù)的結(jié)構(gòu)很簡(jiǎn)單,一般是兩部分組成
1、判斷是否結(jié)束遞歸。
作用是結(jié)束遞歸調(diào)用,遞歸調(diào)用不可能無限的調(diào)用下去,要不然成了死循環(huán)了,呵呵
所以要有一個(gè)結(jié)束的條件,如這里的if(n==0||n==1) return 1
2、調(diào)用本身(或者其他函數(shù)(有雙線遞歸和多線遞歸))
這里就是遞歸的本質(zhì)函數(shù)了,他有兩個(gè)地方要注意
1)就是遞歸的公式,以什么條件來運(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等等
C語言問題:以下是一個(gè)遞歸函數(shù)的例子,請(qǐng)幫我分析一下,這段程序是怎么運(yùn)行的?值的變化是怎么樣的?
從主函數(shù)開始運(yùn)行,遇到調(diào)用函數(shù)時(shí),直接跳到下面的函數(shù)定義中運(yùn)行,然后把返回值帶到主函數(shù),繼續(xù)運(yùn)行主函數(shù)下面的部分。
#includestdio.h
void main()
{
int diecheng(int num); \\聲明函數(shù)
printf("%d",diecheng(5)); \\diecheng(5)即為調(diào)用此函數(shù),實(shí)參為5
}
int diecheng(int num) \\定義函數(shù)
{
int result;
if(num==0)
result=1;
else
result=num*diecheng(num-1);
\\因?yàn)閷?shí)參為5,所以運(yùn)行else下面的,result=5*(5-1)即為20
return result; \\返回result的值(即20)到主函數(shù)的printf語句中,從而打印出來
}
講一下c語言中遞歸函數(shù)的使用方法
遞歸函數(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合并
}
c語言函數(shù)參數(shù)傳遞問題(遞歸時(shí)怎樣傳遞)
#include?stdio.h
/*比如一個(gè)判斷一棵二叉樹是否為滿二叉樹的函數(shù)*/
typedef?struct?btnode{
int?data;
struct?btnode?*lchild;
struct?btnode?*rchild;
}?BTnode;
//?返回最大值?
int?max(int?a,?int?b)
{
return?a??b???a?:?b;
}
//?返回樹的高度?
int?level(BTnode?*bt)
{
if?(NULL?==?bt)?return?0;
return?max(level(bt-lchild),?level(bt-lchild))?+?1;
}
//?是滿二叉樹返回1,不是返回0;
int?bt_juge(BTnode?*bt)
{
return?
NULL?==?bt?||???????????????????????????????//?空樹是滿的,或
level(bt-lchild)?==?level(bt-rchild)????//?左右子樹高度相同,且
bt_jude(bt-lchild)??bt_jude(bt-rchild);?//?左右子樹都是滿的
}
你原來的程序相當(dāng)于這樣:(“只有一個(gè)根節(jié)點(diǎn)的二叉樹是滿二叉樹”這個(gè)判斷沒有必要,可省略)
#include?stdio.h
/*比如一個(gè)判斷一棵二叉樹是否為滿二叉樹的函數(shù)*/
typedef?struct?btnode{
int?data;
struct?btnode?*lchild;
struct?btnode?*rchild;
}?BTnode;
//?是滿二叉樹返回?1,不是返回?0
int?bt_juge(BTnode?*bt,?int?*level)
{
int?l,?r,?a,?b;
if?(NULL?==?bt)
{
*level?=?0;????//?空樹的高度為?0?
return?1;??????//?空樹是滿的?
}
a?=?bt_jude(bt-lchild,?l);??//?判斷左子樹是否滿,并接收左子樹的高度?l
b?=?bt_jude(bt-rchild,?r);??//?判斷右子樹是否滿,并接收右子樹的高度?r
*level?=?(l??r???l?:?r)?+?1;?//?這里把樹本身的高度傳遞回調(diào)用它的程序
return?a??b??(l?==?r);????//?左右子樹都滿,且高度相同,則是滿的?
}
網(wǎng)站名稱:C語言遞歸中函數(shù)參數(shù)變化,c語言遞歸函數(shù)詳解
網(wǎng)站路徑:http://ef60e0e.cn/article/dscscde.html