遞歸,怎麼理解這個概念?我們不需要用複雜的語言來描述這個概念,只需要從這個詞的本意入手即可。遞歸的英文也就是recursion,這個詞的詞源是recur,我們都知道occur的意思是發生,那麼recur的意思也就不難理解了,也就是重複發生。所以說,遞歸,就是指一個事情週期性重複發生,也就是說,在一個算法裏,如果一個方法被重複調用,那麼這個方法就有可能是遞歸的。
那麼怎麼判斷一個問題是否能用遞歸的方法來解?這可以從三方面去考慮。
1. 這個問題的定義是不是遞歸的?
比較典型的就是Fibonacci數列和階乘問題,這兩個問題本身都包含了遞歸的過程,因此很容易判斷出可以用遞歸法去解。
2. 數據本身是不是遞歸的?
這類情況中,比較典型的是鏈表和二叉樹。判斷一個數據是不是遞歸結構,關鍵點在於局部數據和全局數據的結構是不是一樣的,拿單向鏈表來說,每一個節點都有一個數據,一個指向它的指針和一個指向下一個節點的指針,而整個鏈表也是這種結構,因此鏈表是遞歸結構。而對於二叉樹則是一個道理,二叉樹的任意一棵子樹都和它本身具備相同的結構。因此,操作這類數據都可以選擇遞歸。
3. 問題的解法是不是遞歸的?
這種情況稍難判斷一點,需要程序員在自己的腦中模擬一下問題的解決過程,從而找出遞歸關係。最經典的例子莫過於漢諾塔,在移動盤子的過程中,每一次移動底層盤子,都需要把上層的盤子移開,而每次移動的方法又都是相同的,因此是比較典型的遞歸問題。
在各種算法教材上幾乎都把遞歸作爲第一個介紹的算法,但是個人認爲遞歸其實並不是那麼好理解,想正確的判斷出遞歸,並且應用遞歸,是需要大量練習的。