遞迴(recursion)算是接觸的概念中於我最有吸引力的乙個。
學習離散數學時,很多概念是遞迴定義的,感覺遞迴定義什麼意思都沒表達,但是莫名其妙就知道它會以什麼形式出現,很有意思。
遞迴程式更有意思,程式設計師基本沒做什麼事,程式就自動完成了。
這種不勞而獲的感覺
真是太有吸引力了。
遞迴到底是個什麼鬼?
在回答這個問題前,先看一下遞迴的原型(數學內的,不過放心,沒有積分之類的鬼東西)
數學上的遞迴
遞迴這個東西在高中數學就有出現,典型的是斐波那契數列:
f(n)=f(n-1)+f(n-2)
如果給定了初始的f(0)和f(1),這樣整個數列的值也都是知道了。
斐波那契數列在手工求值的時候會比較麻煩,我們通過等比數列來描述遞迴是怎樣運作的。(數學上)
a(n)=a(n-1)*2,a(0)=1
如果我們要求a(100),那麼我們就要求a(99)
求a(99)就要求a(98)
求a(98)就要求a(97)
如此重複下去,我們為求a(1)的到a(0),因為a(0)已知,乘2即可的a(1)
這一部分叫分解
然後在用a(1)求a(2)…..用a(2)求a(3)
最後求得a(99),
然後由a(99)得到a(100)
這一部分叫啥我不知道,資料裡面都是說合併,結合一類的,我喜歡用返回(因為的確是慢慢往最初的呼叫a(100)返回了)
數學上的遞迴有如下特徵:
有基本情況
如等比數列的a(0),斐波那契f(0),f(1)
所有的複雜情況都可以轉換成基本情況。
如果轉換不成,這就不是乙個成功的遞迴,因為你必須的想出乙個其他方式來解決問題
複雜情況轉化到簡單一級情況的是乙個函式關係(也就是說最後的複雜情況下是單值的,不可能出現重值情況)
計算機裡的遞迴
遞迴也就是乙個function呼叫自身。比如說
voidafun(int n)
statement;
afun(n-1);
不過,這只是遞迴的形式而已,或者說函式呼叫自身只是遞迴的乙個特點,遞迴的內涵要比自身呼叫自身這句簡單的話深刻許多。
與遞迴最接近的思想叫做分治法(divide-and-conquer),當然遞迴還與別的相關,分治法是乙個特別能直接體現遞迴解決問題的思路的方法。(遞迴回歸到數學上本質是歸納法)
分治法描述:將原問題分解為幾個規模較小的類似原問題的子問題,然後用同樣的方式遞迴解決這些問題,最後在合併這些子問題的解來建立原問題的解。
這一種描述很精巧,其中有幾個關鍵的細節。
第一:分解的子問題能夠採取同樣的方式解決
第二:必須要有遞迴底層
第三:必須要有乙個合併演算法
第一點是很明顯的,也是遞迴最容易讓人記住的。子問題和大問題能夠同樣解決,但是說實話,這不是遞迴的難點。
在真正編寫的時候,往往只是根據函式原型改寫乙個引數。唯一可能有點難度的就是說有時候要想辦法構造一種變換把大問題轉換成同樣的小問題。
第二點.遞迴底層指的是最小的基本情況,就如斐波那契數列中的f(0),f(1)。如果沒有這個遞迴底層,程式在執行的時候就會不斷得改變引數,不斷得呼叫自身,比如引數的變化規律是減去1,那麼函式就會從function(100)一直遞迴到function(-300)…….直到記憶體因為函式幀爆掉。這和數學上是一樣的,沒有這個基本情況,計算機根本不可能完成任務。
第三點,合併演算法。在真正編寫遞迴函式的時候這是實現的靈魂。
只要腦子清醒,引數寫的正確,計算機總能呼叫到遞迴的底層進行一些很細小的處理,那麼說到了遞迴底層以後呢?發散出了那麼多,最開始的問題還是沒有解決吧。
這時候就要有用到合併演算法往回解決了,通過合併演算法往最初情況走。
什麼意思?既然已經達到了遞迴的最基本情況,並且解決了最基本情況,那麼接下來的事情就是綜合這些結果。
比如我們最後遞迴下來有64個基本情況,合併演算法是兩兩合併解決的,這樣問題規模就變成32,繼續合併變成16,最後回到1的情況。
小論團隊建設
tb team building 團隊建設,雖說通常會以出去或吃或玩的方式進行,但根本目的是為了以輕鬆的形式促進同事交流,讓彼此在玩的過程中混的更熟識更親近些,讓關係更融洽,以提高團隊的凝聚力。tb是在大家緊張忙碌的日常工作中專款專項安排出的集體活動,不僅僅有 犒勞 這個層面的意思,更有 建設團隊 ...
遞迴小練習
演算法入門,看到遞迴,做了幾個小練習。1.1找準基線條件 停止遞迴 1.2明確函式功能,知道寫的函式究竟是幹什麼的 def get max value lst if len lst 2 基線條件 return lst 0 if lst 0 lst 1 else lst 1 return lst 0 ...
JSP中編碼小論
在jsp servlet 中主要有以下幾個地方可以設定編碼,pageencoding utf 8 contenttype text html charset utf 8 request.setcharacterencoding utf 8 和response.setcharacterencoding...