Java中的遞歸思想
阿新 • • 發佈:2018-08-23
turn div art char .cn 調用 over true answer
轉自:https://www.cnblogs.com/xiaosen992608/p/4037682.html
遞歸:
遞歸的概念:方法自身調用自身則稱為遞歸。
遞歸的分類:
間接遞歸:方法A調用方法B,方法B調用方法C,方法C調用方法A。 直接遞歸: 方法A調用方法A。(常用)
遞歸的註意事項:
遞歸一定要出口:結束遞歸的條件。 遞歸次數不要太多。
如果遞歸不結束,則會報錯。
java.lang.StackOverflowError: 棧內存溢出錯誤
遞歸會內存溢出隱患的原因:
方法不停地進棧而不出棧,導致棧內存不足。
遞歸的三個條件:
邊界條件 遞歸前進段 遞歸返回段
當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
下面通過示例程序來說明:1.階乘
public class Test01 { public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (1 == n) return 1; else return n*(n-1); } }
2.斐波納契數列
public static int f(int n) { if (n == 1 || n == 2) { // 遞歸終止條件 return 1; // 簡單情景 } return fibonacci(n - 1) + fibonacci(n - 2); // 相同重復邏輯,縮小問題的規模 }
3.回文字符串的判斷
public static boolean isPalindromeString_recursive(String s){ int start = 0; int end = s.length()-1; if(end > start){ // 遞歸終止條件:兩個指針相向移動,當start超過end時,完成判斷 if(s.charAt(start) != s.charAt(end)){ return false; }else{ // 遞歸調用,縮小問題的規模 return isPalindromeString_recursive(s.substring(start+1).substring(0, end-1)); } } return true; }
知乎用戶李繼剛(https://www.zhihu.com/question/20507130/answer/15551917)對遞歸和循環的生動解釋:
遞歸:你打開面前這扇門,看到屋裏面還有一扇門。你走過去,發現手中的鑰匙還可以打開它,你推開門,發現裏面還有一扇門,你繼續打開它。若幹次之後,你打開面前的門後,發現只有一間屋子,沒有門了。然後,你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這你把鑰匙打開了幾扇門。
循環:你打開面前這扇門,看到屋裏面還有一扇門。你走過去,發現手中的鑰匙還可以打開它,你推開門,發現裏面還有一扇門(若前面兩扇門都一樣,那麽這扇門和前兩扇門也一樣;如果第二扇門比第一扇門小,那麽這扇門也比第二扇門小,你繼續打開這扇門,一直這樣繼續下去直到打開所有的門。但是,入口處的人始終等不到你回去告訴他答案。
Java中的遞歸思想