那些年我錯過的自我遞歸

遙想當年最初面試一家公司Android崗位的時候,因爲當時該司沒有Android工程師,所以來面試我的是一位穿着講究、溫文爾雅的Java老大哥;
不出意外,所問之題,十之八九,皆是不熟,所以一路走下來基本都在請教,當然其中讓我印象最深刻的應該就是遞歸的問題!

Demo codeing ~ Wait me ~

遙想最初,通過那次面試,關於遞歸的知識我瞭解到了以下幾點

1.遞歸本身概念就是自身調用自身,專業點可能就是函數(方法)自己調用自己,其實意義是一樣的~~
2.遞歸要給出口,否則會造成死循環
3.在很早之前手機上,如果造成這種死循環會導致手機卡死,然後直接關機
4.在我們眼前這個年代的手機上,如果造成這種死循環會導致我們APP奔潰,報出的錯可能就是棧溢出,畢竟內存的空間是有限的嘛

既然抽出了時間,那麼我就不僅僅只想了解那麼點了,所以我要在最初的基礎上爲自己添磚加瓦

一個有意思的遞歸概念

方法或函數調用自身的方式稱爲遞歸調用,調用稱爲遞,返回稱爲歸

遞歸分類
  • 直接遞歸

直接遞歸調用就是在函數a(或過程)中直接引用(調用)函數a本身

  • 間接遞歸

間接遞歸調用就是在函數a(或過程)中調用另外一個函數b,而該函數b又引用(調用)了函數a

優缺點剖析
  • 優點:代碼簡潔、邏輯清晰、表達力很強
  • 缺點:空間複雜度高、有堆棧溢出風險、存在重複計算、過多的函數調用會耗時較多等問題
融合基礎,重新整理遞歸思想
  • 遞歸就是方法裏調用自身

  • 在使用遞歸策略算法時,必須有一個明確的遞歸結束條件,稱爲遞歸出口 ;再次提醒必須明確這個出口用來結束遞歸,否則會造成內存溢出,從而導致程序崩潰

  • 遞歸算法代碼簡潔,但遞歸算法解題的運行效率較低;不是很適合用遞歸設計程序

  • 在遞歸調用的過程中系統爲每一層的返回點、局部量等開闢了棧來存儲;遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸算法設計程序

常見問題、解決方案
  • 警惕堆棧溢出

可以聲明一個全局變量來控制遞歸的深度,從而避免堆棧溢出

  • 警惕重複計算

通過某種數據結構來保存已經求解過的值,從而避免重複計算

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