一文搞懂什么是遞歸,程序員必會算法之一
前言
今天我們來講講遞歸
算法,遞歸在我們日常工作中是比較常見
且常用
的算法,面試中
面試官也經常會讓我們手寫
遞歸算法。由此可見遞歸算法的重要性
。
遞歸

什么是遞歸
簡單來說遞歸就是方法自己調用自己,每次調用時傳入不同的變量。一直到程序執行到指定的出口時停止調用本身,並將結果層層返回。

遞歸的優點
遞歸的核心思想就是將一個大問題,拆解成一個小問題,然后將小問題再次拆解,層層拆分從而簡化問題。這種設計理念可以簡化重復的代碼讓程序變得更加簡潔。
遞歸的缺點
-
使用遞歸算法時每次方法的調用都需要在棧中開辟出一個空間保存相關數據,頻繁的壓棧、彈棧會導致效率變低。
-
使用遞歸算法解決問題必須要有出口,不然就形成死循環了。好好的遞歸變成了“死歸”!
-
遞歸的調用次數不宜過多不然會造成棧溢出。

舉個例子

從前有座山,山里有座廟,廟里有位老和尚,老和尚在干嘛呢?老和尚在講故事。講的什么故事呢?
從前有座山,山里有座廟 ……
這是我們耳熟能詳的故事,我們就通過這個案例來講講遞歸
。
條件設定
-
老和尚講故事,老和尚
壽命
是5歲
-
每
講一次
壽命就減一歲
-
當歲數減到
0
的時候,老和尚就圓寂了,就停止
了講故事 -
最終返回總共講故事的
次數
算法實現
// 壽命5歲
private static Integer life = 5;
// 講故事次數
private static Integer storyNum = 0;
public static Integer tellStory(Integer life) {
if (life > 0) {
System.out.println("從前有座山,山里有座廟,廟里有位老和尚,老和尚在干嘛呢?老和尚在講故事。講的什么故事呢?");
-- life;
// 老和尚還沒圓寂,繼續講故事,這就是遞歸
tellStory(life);
} else {
System.out.println("老和尚圓寂了,沒辦法在給大家講故事了!");
return storyNum;
}
return ++ storyNum;
}
public static void main(String[] args) {
Integer num = tellStory(life);
System.out.println("老和尚總共講了" + num + "次故事");
}
復制代碼
遞歸結果


IT 老哥
一個在大廠做高級Java開發的程序猿