1.遞歸
一個(gè)函數(shù)自己直接或間接調(diào)用自己心例。
思想就是:將問題規(guī)模不斷縮小,化繁為簡翎卓,求n契邀!轉(zhuǎn)化成(n-1)!,再轉(zhuǎn)換成(n-2)摆寄!.......最后轉(zhuǎn)換成(1)!.
有如漢諾塔問題失暴,如果初始有10個(gè)砝碼坯门,要從A移動(dòng)到C,這個(gè)看起來比較復(fù)雜逗扒。只要把前9個(gè)移動(dòng)到B古戴,然后移
動(dòng)第10個(gè)到C。那這9個(gè)怎么移動(dòng)呢矩肩,也用這種方式现恼。。黍檩。這就是遞歸實(shí)現(xiàn)漢諾塔叉袍。
現(xiàn)在我們來看一個(gè)簡單的遞歸算法:C語言實(shí)現(xiàn)漢諾塔
遞歸算法的精髓是一層入一層,直至遇到滿足的結(jié)束語句刽酱,所以一般和遞歸在一起的是一些判斷語句喳逛。遞歸函數(shù)得要有終止語句。
遇到遞歸問題需要根據(jù)規(guī)律解決棵里。
(1)找到所謂的終止條件润文,即讓遞歸停止的條件
(2)找到遞推的關(guān)系式
(3)遞歸的方向要搞清楚,一般是向最終的終止條件不斷遞歸
(4)遞歸 分為回推和遞推兩個(gè)階段殿怜,當(dāng)遞推到終止條件時(shí)典蝌,程序會(huì)反向推回(回推)!M访铡?ハ啤!
用遞歸算法(recursion)計(jì)算階乘
codes:
/**************************************
*author: Yang Xu
*goals: compute factorial by recursion
***************************************/
#include
#include
int main()
{
/*print the result of factorial*/
printf("%d\n", f(5));
system("pause");
return 0;
}
int f(int n)
{
int x;
/*這里就不加關(guān)于負(fù)整數(shù)的判斷了*/
if(n==1||n==0)
x=1;
else
x=n*f(n-1);//the recursion
return x;
}
例題
有5個(gè)人坐在一起柱告,問第5個(gè)人多少歲砖织?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù)末荐,他說比第3個(gè)人大2歲侧纯。問第3個(gè)人,又說比第2人大兩歲甲脏。問第2個(gè)人眶熬,說比第1個(gè)人大兩歲。最后 問第1個(gè)人块请,他說是10歲娜氏。請(qǐng)問第5個(gè)人多大?
程序分析:
利用遞歸的方法墩新,遞歸分為回推和遞推兩個(gè)階段贸弥。要想知道第5個(gè)人歲數(shù),需知道第4人的歲數(shù)海渊,依次類推绵疲,推到第1人(10歲)哲鸳,再往回推。
#include
/*
* 請(qǐng)使用遞歸函數(shù)完成本題
* 小編已將正確代碼放在左側(cè)任務(wù)的“不知道怎么辦”里
* 小編希望各位童鞋獨(dú)立完成哦~
*/
//定義一個(gè)函數(shù)盔憨,傳送人員序號(hào)進(jìn)去徙菠,返回該序號(hào)員工的年齡。
int getAge(numPeople)
{
//定義返回的年齡
int age;
//如果是第1個(gè)人的時(shí)候郁岩,年齡為10歲
if(numPeople==1)
age=10; //這是回推墻婿奔,也就是結(jié)束遞歸的條件。
else
//還沒接觸到回推墻问慎,就自我調(diào)用萍摊,謂之遞歸。
age = getAge(numPeople-1)+2; //年齡等于上一個(gè)人的年齡加2
return age;
}
int main()
{
printf("第5個(gè)人的年齡是%d歲", getAge(5));
return 0;
}
小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【?六四二如叼,一二零记餐,九一四 】,無論你是大牛還是小白薇正,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)片酝!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享挖腰!學(xué)習(xí)更多C/C++相關(guān)知識(shí)也可以去公眾號(hào)——“huainian_c”雕沿。
2. 善用遞歸:
使用遞歸有利有弊,有點(diǎn)自然是為某些問題提供了簡單的解決辦法猴仑,同時(shí)审轮,代碼看起來也很簡潔;而缺點(diǎn)也不容忽視辽俗,很多遞歸會(huì)很快耗盡計(jì)算機(jī)的內(nèi)部資源疾渣。分分鐘電腦死機(jī)。
正因?yàn)槿绱搜缕芏噙f歸我們都可以使用非遞歸來代替榴捡,比如下面我們求兩個(gè)整數(shù)的最大公約數(shù):
3.結(jié)束語
現(xiàn)在的程序設(shè)計(jì)追求的就是可讀性好,遞歸的算法看起來簡潔朱浴。隨著計(jì)算機(jī)性能的不斷提高吊圾,程序在更多的場合是優(yōu)先考慮可讀性,因此翰蠢,如果可以项乒,鼓勵(lì)使用遞歸優(yōu)先實(shí)現(xiàn)程序思想。
每天進(jìn)步一點(diǎn)點(diǎn)梁沧,每天消化一點(diǎn)點(diǎn)檀何。如果你有更高的想法,歡迎一起交流。如果覺得文章寫得還不錯(cuò)频鉴,點(diǎn)個(gè)贊唄栓辜。