程序調(diào)用自身的編程技巧稱(chēng)為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用。 一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解。
成都創(chuàng)新互聯(lián)公司長(zhǎng)期為近1000家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為龍華企業(yè)提供專(zhuān)業(yè)的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),龍華網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
遞歸策略只需少量的程序就可描述出解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語(yǔ)句來(lái)定義對(duì)象的無(wú)限集合。
一般來(lái)說(shuō),遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
擴(kuò)展資料:
遞歸的應(yīng)用
1、數(shù)據(jù)的定義是按遞歸定義的。(Fibonacci函數(shù))
2、問(wèn)題解法按遞歸算法實(shí)現(xiàn)。這類(lèi)問(wèn)題雖則本身沒(méi)有明顯的遞歸結(jié)構(gòu),但用遞歸求解比迭代求解更簡(jiǎn)單,如Hanoi問(wèn)題。
3、數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的。
遞歸的缺點(diǎn)
遞歸算法解題相對(duì)常用的算法如普通循環(huán)等,運(yùn)行效率較低。因此,應(yīng)該盡量避免使用遞歸,除非沒(méi)有更好的算法或者某種特定情況,遞歸更為適合的時(shí)候。在遞歸調(diào)用的過(guò)程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開(kāi)辟了棧來(lái)存儲(chǔ)。遞歸次數(shù)過(guò)多容易造成棧溢出等。
參考資料來(lái)源:百度百科-遞歸
遞歸:就是自己調(diào)自己,但是沒(méi)終止條件會(huì)死循環(huán),所以你的遞歸代碼里有結(jié)束自調(diào)自的條件,這樣就創(chuàng)造了有限次的循環(huán)(代碼中你看不到for或foreach但是有循環(huán)發(fā)生)
所謂遞歸,說(shuō)的簡(jiǎn)單點(diǎn),就是函數(shù)自己調(diào)用自己,然后在某個(gè)特定條件下。結(jié)束這種自我調(diào)用。
如果不給予這個(gè)結(jié)束條件,就成了無(wú)限死循環(huán)了。這樣這個(gè)遞歸也就毫無(wú)意義了。
如下面問(wèn)題
1 1 2 3 5 8 13 21 ........n
分析可以看出, i 表示第幾個(gè)數(shù), n 表示該數(shù)的值
當(dāng)i = 1 時(shí), n = 1;
當(dāng)i = 2 時(shí), n = 1;
當(dāng)i = 3 時(shí) n = i1 + i2;
當(dāng)i = 4 時(shí) n = i2 + i3
所以可以寫(xiě)個(gè)函數(shù)
int fun(int n) // 這里的n代表第幾個(gè)數(shù)
{
if(1 == n || 2 == n) // 第一個(gè)數(shù)
{
return 1;
}
else
{
return fun(n - 1) + fun(n - 2); // 這里就是自己調(diào)用自己,形成循環(huán)自我調(diào)用。
}
}
注: 以上代碼只是用來(lái)演示遞歸,不包含錯(cuò)誤校驗(yàn)。
在實(shí)際生產(chǎn)過(guò)程中。該代碼不夠健壯。
如此,就完成了遞歸。你就可以求得第n個(gè)數(shù)了。
何時(shí)考慮使用遞歸。
當(dāng)你分析一個(gè)問(wèn)題的時(shí)候,發(fā)現(xiàn)這個(gè)問(wèn)題,是一個(gè)自我循環(huán)時(shí),而且這個(gè)自我循環(huán)到一個(gè)給定值,就可以終止的時(shí)候,你就快要考慮遞歸了。
#includestdio.h
int?account_next(int?a[][8],?int?m,?int?n)
{
//?列索引n執(zhí)行+1,即進(jìn)入下一列
if?(-1?=?n??n?!=?8)
n++;
//?當(dāng)列索引n至最后一列時(shí)(n=8),行索引m執(zhí)行+1,即進(jìn)入下一行
else?if?(-1?=?m??m?!=?8)
{
n?=?0;
m++;
}
//?當(dāng)行索引=8時(shí),說(shuō)明已經(jīng)遍歷全部元素
else
return?0;
if?(0?=?m??m??8??0?=?n??n??8??a[m][n]?==?0)
{
//?計(jì)數(shù)a[m][n]左、右、上、下、左上、左下、右上、右下1的個(gè)數(shù)
int?c?=?0;
//?left
if?(0??n??1?==?a[m][n?-?1])?c++;
//?right
if?(7??n??1?==?a[m][n?+?1])?c++;
//?up
if?(0??m??1?==?a[m?-?1][n]) c++;
//?down
if?(7??m??1?==?a[m?+?1][n])?c++;
//?left?up
if?(0??m??0??n??1?==?a[m?-?1][n?-?1]) c++;
//?left?down
if?(7??m??0??n??1?==?a[m?+?1][n?-?1])?c++;
//?right?up
if?(0??m??7??n??1?==?a[m?-?1][n?+?1])?c++;
//?right?down
if?(7??m??7??n??1?==?a[m?+?1][n?+?1]) c++;
printf("a[?%d?][?%d?]?周?chē)?%d?個(gè)1.\n",?m,?n,?c);
}
//?計(jì)數(shù)a[m][n]下一個(gè)元素
account_next(a,?m,?n);
}
int?main(void)
{
int?a[8][8]?=?{
{?1,?1,?1,?1,?1,?1,?1,?1?},
{?1,?1,?0,?0,?1,?0,?0,?1?},
{?1,?0,?0,?1,?0,?0,?1,?1?},
{?1,?1,?1,?0,?0,?1,?0,?1?},
{?1,?0,?1,?1,?1,?0,?0,?1?},
{?1,?1,?0,?0,?0,?1,?1,?1?},
{?1,?1,?1,?1,?0,?0,?0,?1?},
{?1,?1,?1,?1,?1,?1,?1,?1?}?};
account_next(a,?0,?-1);
return?0;
}
循環(huán)與遞歸的本質(zhì)區(qū)別在于內(nèi)存的使用上,遞歸是方法調(diào)用方法本身,而隨著遞歸的次數(shù)的增加,內(nèi)存的消耗也是不斷增長(zhǎng),而在我們寫(xiě)代碼時(shí),內(nèi)存是一個(gè)很重要的部分,我們盡量都是減少內(nèi)存的消耗,以免造成對(duì)系統(tǒng)資源的浪費(fèi),循環(huán)占用的內(nèi)存很少,每次循環(huán)都會(huì)釋放之前分配的內(nèi)存,但是很多遞歸的功能是不能用循環(huán)實(shí)現(xiàn)的,這就要考慮你要實(shí)現(xiàn)的功能了,如果非遞歸不可完成的功能,我們也不會(huì)刻意更改。
文章題目:C語(yǔ)言函數(shù)遞歸循環(huán),循環(huán)語(yǔ)句和遞歸函數(shù)的區(qū)別
路徑分享:http://www.chinadenli.net/article8/dseopop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、網(wǎng)站營(yíng)銷(xiāo)、靜態(tài)網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)