遞歸的本質是什麼?

遞歸給我們帶來了什麼新的思考?


遞歸的本質是復讀機

人類的本質是復讀機

所以。。。。。。。。。

遞歸函數就是人類本身


遞歸就是自己調用自身,本質就是將規模較大的問題化成結構相同但規模較小的問題。即大事化小,小事化了。為了避免死循環,要設一個結束條件,不能無限劃分下去。

比如,斐波那契數列,第n項值F(n)可以表示為F(n-1)+F(n-2)。將較大的n化為兩個較小的數,最終縮小到1和0,而F(0)=1,F(1)=1,劃分結束。再一步步還原成大的。

將大的分解成小的,再由小的還原成大的,就是遞歸的本質。只不過,我們只管將大的分解成小的。而由小的還原成大的,是由機器自動完成的。


本質上來說,遞歸可以用棧實現,可以說遞歸的本質是棧。

另一方面,迭代與遞歸在理論上可以等價代換,但是思路完全不同。遞歸比較接近人類的思維,即由高到低。迭代則是由低到高。二者之間的轉換也是複雜的。

遞歸的還有一個有趣之處在於可以優先聲明一個問題的終止邊界,剩餘則交給子問題來處理,也就是已知起點,設定終點,給一個方向,就算方向有點繞,只要不往回跑,基本上可以確定程序自己能夠走到終點。就算自己無法把握遞歸的全貌,依然能夠讓程序求出問題的解。

另外我還可以想到lambda是如何微妙的處理遞歸函數的,以及尾遞歸的優化之類的細節。具體部分我也不熟悉,有興趣可以自己了解。


你需要嘗試一下函數式編程,光靠別人講本質是永遠體會不到真正的本質的。


問題標籤中有「編程」,那麼編程中遞歸的本質這裡分兩個層次:

1、計算機執行的底層機制

簡書上這篇文章說的相對清晰易懂了,就是棧的一種應用方式

遞歸的本質?

www.jianshu.com圖標

2、解決問題的思想上

如果一個問題的解決方式(邏輯A)不複雜,但是問題的規模(任務量)比較大。那麼需要做的就是不斷地分解問題的規模,分解到最後你會發現,問題規模無法進一步分解(即 任務 分無可分,不可再分),以至於有的時候甚至不需要任何處理即可直接返回。接下來要做的就是根據 邏輯A 把返回的成果收集起來(層層匯總)。(注意遞歸與分治的思想是有區別的,簡單來說,分治更側重於分解後的並行處理,而遞歸注重問題規模的分解。進一步說,遞歸更多的是用在分治過程中的任務分解這一環節。)

至於什麼函數自己調用自己,找到遞歸出口,都是表現層的東西,記住了就說明可以用遞歸了。


從解決問題的思路上,遞歸的本質就是不斷地把問題規模減小直至直接可以得到答案。


我的理解就是把大的問題分解成與原來問題相同但規模較小的問題,直到這個小的問題能夠直接使用簡單的方法解決。


不停的迭代調用一個函數


推薦閱讀:

TAG:思考 | 演算法 | 數學 | 思維 | 編程 |