遙想當年最初面試一家公司Android崗位的時候,因爲當時該司沒有Android工程師,所以來面試我的是一位穿着講究、溫文爾雅的Java老大哥;
不出意外,所問之題,十之八九,皆是不熟,所以一路走下來基本都在請教,當然其中讓我印象最深刻的應該就是遞歸的問題!
Demo codeing ~ Wait me ~
遙想最初,通過那次面試,關於遞歸的知識我瞭解到了以下幾點
1.遞歸本身概念就是自身調用自身,專業點可能就是函數(方法)自己調用自己,其實意義是一樣的~~
2.遞歸要給出口,否則會造成死循環
3.在很早之前手機上,如果造成這種死循環會導致手機卡死,然後直接關機
4.在我們眼前這個年代的手機上,如果造成這種死循環會導致我們APP奔潰,報出的錯可能就是棧溢出,畢竟內存的空間是有限的嘛
既然抽出了時間,那麼我就不僅僅只想了解那麼點了,所以我要在最初的基礎上爲自己添磚加瓦
一個有意思的遞歸概念
方法或函數調用自身的方式稱爲遞歸調用,調用稱爲遞,返回稱爲歸
遞歸分類
直接遞歸調用就是在函數a(或過程)中直接引用(調用)函數a本身
間接遞歸調用就是在函數a(或過程)中調用另外一個函數b,而該函數b又引用(調用)了函數a
優缺點剖析
- 優點:代碼簡潔、邏輯清晰、表達力很強
- 缺點:空間複雜度高、有堆棧溢出風險、存在重複計算、過多的函數調用會耗時較多等問題
融合基礎,重新整理遞歸思想
-
遞歸就是方法裏調用自身
-
在使用遞歸策略算法時,必須有一個明確的遞歸結束條件,稱爲遞歸出口 ;再次提醒必須明確這個出口用來結束遞歸,否則會造成內存溢出,從而導致程序崩潰
-
遞歸算法代碼簡潔,但遞歸算法解題的運行效率較低;不是很適合用遞歸設計程序
-
在遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲;遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸算法設計程序
常見問題、解決方案
- 警惕堆棧溢出
可以聲明一個全局變量來控制遞歸的深度,從而避免堆棧溢出
- 警惕重複計算
通過某種數據結構來保存已經求解過的值,從而避免重複計算