程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。 一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解。

成都創(chuàng)新互聯(lián)公司長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為龍華企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),龍華網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。
一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
擴(kuò)展資料:
遞歸的應(yīng)用
1、數(shù)據(jù)的定義是按遞歸定義的。(Fibonacci函數(shù))
2、問題解法按遞歸算法實(shí)現(xiàn)。這類問題雖則本身沒有明顯的遞歸結(jié)構(gòu),但用遞歸求解比迭代求解更簡單,如Hanoi問題。
3、數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的。
遞歸的缺點(diǎn)
遞歸算法解題相對(duì)常用的算法如普通循環(huán)等,運(yùn)行效率較低。因此,應(yīng)該盡量避免使用遞歸,除非沒有更好的算法或者某種特定情況,遞歸更為適合的時(shí)候。在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開辟了棧來存儲(chǔ)。遞歸次數(shù)過多容易造成棧溢出等。
參考資料來源:百度百科-遞歸
遞歸:就是自己調(diào)自己,但是沒終止條件會(huì)死循環(huán),所以你的遞歸代碼里有結(jié)束自調(diào)自的條件,這樣就創(chuàng)造了有限次的循環(huán)(代碼中你看不到for或foreach但是有循環(huán)發(fā)生)
所謂遞歸,說的簡單點(diǎn),就是函數(shù)自己調(diào)用自己,然后在某個(gè)特定條件下。結(jié)束這種自我調(diào)用。
如果不給予這個(gè)結(jié)束條件,就成了無限死循環(huán)了。這樣這個(gè)遞歸也就毫無意義了。
如下面問題
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
所以可以寫個(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)用。
}
}
注: 以上代碼只是用來演示遞歸,不包含錯(cuò)誤校驗(yàn)。
在實(shí)際生產(chǎn)過程中。該代碼不夠健壯。
如此,就完成了遞歸。你就可以求得第n個(gè)數(shù)了。
何時(shí)考慮使用遞歸。
當(dāng)你分析一個(gè)問題的時(shí)候,發(fā)現(xiàn)這個(gè)問題,是一個(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í),說明已經(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?]?周圍有?%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)存的消耗也是不斷增長,而在我們寫代碼時(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語言函數(shù)遞歸循環(huán),循環(huán)語句和遞歸函數(shù)的區(qū)別
路徑分享:http://chinadenli.net/article8/dseopop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、網(wǎng)站營銷、靜態(tài)網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)