?? 遞歸算法,簡單卻不簡單的一種算法。
??? 遞歸算法是把問題轉(zhuǎn)化為規(guī)??s小了的同類問題的子問題。然后遞歸調(diào)用函數(shù)(或過程)來表示問題的解。??????? ——百度百科-遞歸算法
??? 遞歸算法是使用遞歸在程序設(shè)計語言中廣泛使用的一種算法,遞歸是什么?遞歸是程序調(diào)用自身的編程技巧(百度百科)。遞歸在計算機科學中是指一種通過重復(fù)將問題分解為同類的子問題而解決問題的方法(維基百科)。
??? 說白了,遞歸是一種方法,是對自身的調(diào)用。打個比方,我想吃蘋果了,然后我做了一個計劃。這蘋果在一個程序里面就是數(shù)據(jù),然后我制定的吃蘋果的這一套計劃,就是方法。我按照我制定的計劃吃蘋果就是用方法處理數(shù)據(jù)。我是怎么吃蘋果的,我拿起桌子上這個蘋果(這蘋果是砸到牛頓的蘋果),然后咬了一口(現(xiàn)在成喬布斯的了),然后在放回桌子上,我吃了蘋果了,這計劃就結(jié)束了。有說,你這蘋果沒吃完呢,沒吃完就對了,我計劃就是吃蘋果,沒說要吃完蘋果,我要吃完蘋果也簡單,再拿起來,咬一口,放下,然后拿起來,咬一口,放下......直到我最后剩一口蘋果核,我不能吃了,我這就結(jié)束了。

??? 我把蘋果從一個完整的蘋果一步一步吃到蘋果核,這個過程就是遞歸。遞歸有四個法則:
??????????? 第一個是基準情形,是不用遞歸就能求解。我吃蘋果,這次我不用遞歸了,我不拿起來放下,太費事,我一次拿起來,咔嚓咔嚓一口一口吃完,這是迭代,最終結(jié)果一樣,我剩下了蘋果核。用遞歸方式,我吃蘋果這過程,最后剩一口蘋果核,我不能再吃了,這就是基準情形,也就是遞歸出口,從這里我結(jié)束了我吃蘋果這過程,我結(jié)束了遞歸。
??????????? 第二個法則是不斷推進,也就是我的遞歸必須能朝著我的基準情形的方向推進。我每吃一口蘋果,我就離蘋果核,也就是基準情形更進一步。
??????????? 第三個法則是設(shè)計法則,是假設(shè)所有的遞歸調(diào)用都能運行。比如我吃的這個蘋果,一口下去,嗬,半條蟲子,我這沒法吃了,這就沒法結(jié)束了,從某種意義上講,我這沒做容錯處理,這遞歸就不算遞歸了,因為沒法繼續(xù)。
??????????? 第四個法則是合成效益法則,是在求解一個問題的同一個實例時候,切勿在不同的遞歸調(diào)用中做重復(fù)性工作。什么意思呢,就是我吃蘋果不喜歡吃皮,然后我在開始的時候(吃蘋果當然不能再所有時候都吃到蘋果皮,只是有皮的地方能吃到)吃一口蘋果,把皮吐出來,吃一口吐一口,我這就重復(fù)了,影響效益了。所以我直接在開始把皮削好就成了。
??? 我在文章的開頭說過這么一句話:遞歸算法,簡單卻不簡單的一種算法。為什么我說遞歸算法簡單卻不簡單?
? ? ? ? 從算法本身講,算法的級別、難度、理解度都是極其簡單的,深一步能有分治策略,這是個底層的算法,可以說得上是一種元算法了,況且就理解起來而言,遞歸算法算得上是最簡單的一種算法了??晌矣终f遞歸算法是不簡單的一種算法,遞歸算法本身的步驟是有限的,算法的深度是有限的,但是算法能執(zhí)行的深度是無限的。我的老師給我講過一個故事:UNIX系統(tǒng)的第一個版本的系統(tǒng),本身是用了六個程序塊相互遞歸調(diào)用,然后組成了這個完美、優(yōu)雅的UNIX系統(tǒng)(僅從授課教師聽到,未曾在網(wǎng)絡(luò)找到文字記載)。
??? 計算機科學大師尼克勞斯·維爾特描述遞歸的一句話:遞歸的強大之處在于它允許用戶用有限的語句描述無限的對象。因此,在計算機科學中,遞歸可以被用來描述無限步的運算,盡管描述運算的程序是有限的。