遞迴本身是十分容易理解的,從數學角度來看只是很簡單的函式的自我呼叫,比如Fibonacci數列:f(0) = 0f(1) = 1f(k) = f(k - 1) + f(k - 2)其實遞迴的概念在高中階段就已經介紹了,就是經常用來證明數列題的”數學構造法“,特點很明顯:結構簡單、證明粗暴,只要你架構好了框架就能證明出結論。那麼什麼是遞迴的”結構簡單“的框架?
遞迴本身是十分容易理解的,從數學角度來看只是很簡單的函式的自我呼叫,比如Fibonacci數列:f(0) = 0f(1) = 1f(k) = f(k - 1) + f(k - 2)其實遞迴的概念在高中階段就已經介紹了,就是經常用來證明數列題的”數學構造法“,特點很明顯:結構簡單、證明粗暴,只要你架構好了框架就能證明出結論。那麼什麼是遞迴的”結構簡單“的框架?
初始條件: f(0) = 0, f(1) = 1遞迴的表示式: f(k) = f(k - 1) + f(k - 2)而其實關於Fibonacci,每個人從f(0)開始往後計算都會,而且很自然。哪怕讓你算f(1000),你需要的不過是紙、筆、時間,所以,遞迴本身的難度不大。那麼又為什麼遞迴會給人難以理解的印象?那是因為"遞迴的實現"難以理解,尤其是利用計算機語言實現遞迴。因為,實現是反過來的,不是讓你從初始條件推,而是反過來一直推到初始條件,初始條件反而變成了退出條件。為了能夠反推,計算機必須利用棧來儲存整個遞迴過程中產生的資料,所以寫遞迴會遇到棧溢位的問題。為了能實現遞迴,人腦也要去模擬整個的遞迴過程,可惜的是,人腦的儲存有限,雙引數三層遞迴基本就能讓你溢位。所以,最直接的方法就是用紙把腦子中的棧記錄下來。十分機械痛苦,且耗費耐心,但是往往在過程中還是能發現問題。或者,回到遞迴本身的定義上,自己首先寫上架構,然後填充。定義好退出條件,定義好表示式。之後再嚴格按照架構實現程式碼。遞迴的程式碼一般都是足夠簡單的,所以實現上不容易出錯。一旦程式結果有問題,首先不應該是去檢查程式碼,而是應該去檢查自己的定義。死迴圈?初始條件錯了、漏了;錯誤結果?遞迴式有問題。找出問題了,再依照新的架構改動程式碼。沒有把問題定義清楚前不要去實現。當然,實在不行,只能最後一招:紙和筆。-----------------------以上都是廢話的分割線-----------------------好了,我們講重點吧:The Little Schemer 看完這本”兒童讀物“,從此遞迴是路人,我是認真的。關於SICP這本書,你就為了掌握遞迴,有必要去看好幾百頁的書實現個直譯器麼。看完兒童讀物再看這個SICP麼。