定義:
在數(shù)學(xué)與計(jì)算機(jī)科學(xué)中汇四,是指在函數(shù)的定義中使用函數(shù)自身的方法断箫。遞歸一詞還較常用于描述以自相似方法重復(fù)事物的過(guò)程默终。例如汇歹,當(dāng)兩面鏡子相互之間近似平行時(shí)屁擅,鏡中嵌套的圖像是以無(wú)限遞歸的形式出現(xiàn)的。也可以理解為自我復(fù)制的過(guò)程产弹。
例子:
- 從前有座山派歌,山里有座廟,廟里有個(gè)老和尚痰哨,正在給小和尚講故事呢胶果!故事是什么呢?“從前有座山斤斧,山里有座廟早抠,廟里有個(gè)老和尚,正在給小和尚講故事呢撬讽!故事是什么呢蕊连?‘從前有座山,山里有座廟游昼,廟里有個(gè)老和尚甘苍,正在給小和尚講故事呢!故事是什么呢烘豌?……’”
- 一只狗來(lái)到廚房载庭,偷走一小塊面包。廚子舉起杓子,把那只狗打死了囚聚。于是所有的狗都跑來(lái)了靖榕,給那只狗掘了一個(gè)墳?zāi)梗€在墓碑上刻了墓志銘靡挥,讓未來(lái)的狗可以看到:“一只狗來(lái)到廚房序矩,偷走一小塊面包鸯绿。廚子舉起杓子跋破,把那只狗打死了。于是所有的狗都跑來(lái)了瓶蝴,給那只狗掘了一個(gè)墳?zāi)苟痉担€在墓碑上刻了墓志銘,讓未來(lái)的狗可以看到:‘一只狗來(lái)到廚房舷手,偷走一小塊面包拧簸。廚子舉起杓子,把那只狗打死了男窟。于是所有的狗都跑來(lái)了盆赤,給那只狗掘了一個(gè)墳?zāi)梗€在墓碑上刻了墓志銘歉眷,讓未來(lái)的狗可以看到……’”
程序語(yǔ)言中的遞歸:
程序調(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)求解淑际,遞歸策略只需少量的程序就可描述出解題過(guò)程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量扇住。遞歸的能力在于用有限的語(yǔ)句來(lái)定義對(duì)象的無(wú)限集合春缕。
遞歸的條件:
一般來(lái)說(shuō),遞歸需要有邊界條件艘蹋、遞歸前進(jìn)段和遞歸返回段锄贼。當(dāng)邊界條件不滿(mǎn)足時(shí),遞歸前進(jìn)女阀;當(dāng)邊界條件滿(mǎn)足時(shí)咱娶,遞歸返回。
- 基線條件 base case 函數(shù)不再調(diào)用自己
- 遞歸條件 函數(shù)調(diào)用自己
構(gòu)成遞歸需具備的條件:
- 子問(wèn)題須與原始問(wèn)題為同樣的事强品,且更為簡(jiǎn)單膘侮;
- 不能無(wú)限制地調(diào)用本身,須有個(gè)出口的榛,化簡(jiǎn)為非遞歸狀況處理琼了。
遞歸的缺點(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ò)多容易造成棧溢出等燥爷。
棧:
實(shí)例:求階乘
def factorial(n):
if n == 1:
return n
else:
return n*factorial(n-1)
上例中溶推,n==1是基線條件(base case)崎溃,n $\neq$ 1是遞歸條件(recursive case)。
棧
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表新思。其限制是僅允許在表的一端進(jìn)行插入和刪除運(yùn)算香到。這一端被稱(chēng)為棧頂脾歇,相對(duì)地蚣录,把另一端稱(chēng)為棧底。向一個(gè)棧插入新元素又稱(chēng)作進(jìn)棧立宜、入椕疤眩或壓棧,它是把新元素放到棧頂元素的上面橙数,使之成為新的棧頂元素尊流;從一個(gè)棧刪除元素又稱(chēng)作出棧或退棧商模,它是把棧頂元素刪除掉奠旺,使其相鄰的元素成為新的棧頂元素。
棧是限定僅在表頭進(jìn)行插入和刪除操作的線性表施流。
堆疊數(shù)據(jù)結(jié)構(gòu)使用兩種基本操作:推入(push)和彈出(pop):
- 推入:將數(shù)據(jù)放入堆疊的頂端(陣列形式或串列形式)响疚,堆疊頂端top指標(biāo)加一。
- 彈出:將頂端數(shù)據(jù)資料輸出(回傳)瞪醋,堆疊頂端資料減一忿晕。
棧的基本特點(diǎn):
- 先入后出,后入先出银受。
- 除頭尾節(jié)點(diǎn)之外践盼,每個(gè)元素有一個(gè)前驅(qū),一個(gè)后繼宾巍。