怎麼判斷一個問題是不是遞歸的

 

遞歸,怎麼理解這個概念?我們不需要用複雜的語言來描述這個概念,只需要從這個詞的本意入手即可。遞歸的英文也就是recursion,這個詞的詞源是recur,我們都知道occur的意思是發生,那麼recur的意思也就不難理解了,也就是重複發生。所以說,遞歸,就是指一個事情週期性重複發生,也就是說,在一個算法裏,如果一個方法被重複調用,那麼這個方法就有可能是遞歸的。

 

那麼怎麼判斷一個問題是否能用遞歸的方法來解?這可以從三方面去考慮。

 

1.       這個問題的定義是不是遞歸的?

比較典型的就是Fibonacci數列和階乘問題,這兩個問題本身都包含了遞歸的過程,因此很容易判斷出可以用遞歸法去解。

 

2.       數據本身是不是遞歸的?

這類情況中,比較典型的是鏈表和二叉樹。判斷一個數據是不是遞歸結構,關鍵點在於局部數據和全局數據的結構是不是一樣的,拿單向鏈表來說,每一個節點都有一個數據,一個指向它的指針和一個指向下一個節點的指針,而整個鏈表也是這種結構,因此鏈表是遞歸結構。而對於二叉樹則是一個道理,二叉樹的任意一棵子樹都和它本身具備相同的結構。因此,操作這類數據都可以選擇遞歸。

 

3.       問題的解法是不是遞歸的?

這種情況稍難判斷一點,需要程序員在自己的腦中模擬一下問題的解決過程,從而找出遞歸關係。最經典的例子莫過於漢諾塔,在移動盤子的過程中,每一次移動底層盤子,都需要把上層的盤子移開,而每次移動的方法又都是相同的,因此是比較典型的遞歸問題。

 

在各種算法教材上幾乎都把遞歸作爲第一個介紹的算法,但是個人認爲遞歸其實並不是那麼好理解,想正確的判斷出遞歸,並且應用遞歸,是需要大量練習的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章