1. 程式人生 > >Java中的遞歸思想

Java中的遞歸思想

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中的遞歸思想