什麼是遞歸?遞歸的前行和回退在代碼中的具體演示

人瞭解迭代,神瞭解遞歸。

1.介紹

  • 遞歸指的是調用自己的函數。每個遞歸函數都有兩部分:基線條件(base case)和遞歸條件(recursive case)。遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。

可以藉助理解循環來理解遞歸:

舉個栗子,你用你手中的鑰匙打開一扇門,結果去發現前方還有一扇門,緊接着你又用鑰匙打開了這扇門,然後你又看到一扇們…(這是前行階段)但是當你開到某扇門時,發現前方是一堵牆無路可走了,你選擇原路返回(回退階段)——這就是遞歸

但是如果你打開一扇門後,同樣發現前方也有一扇們,緊接着你又打開下一扇門…但是卻一直沒有碰到盡頭——這就是循環。

  • 簡單來說,循環是有去無回,而遞歸則是有去有回(因爲存在終止條件)。

2.示例

/**
 * @author sjf
 * @date 2020/2/29 19:57
 */
public class recursion {
    public static void main(String[] args) {
        System.out.print("我激動地抱住");
        f(3);
    }

    public static void f(int n ){
        if(n==1) {
            System.out.print("我的抱枕");
            return;
        }
        System.out.print("抱着");
        else
        f(n-1);
        System.out.print("的我");
    }
}

上述代碼的運行結果:
運行結果

代碼其實十分簡單,但是需要理解的是:if代碼塊的條件(n==1)爲遞歸調用的終止條件,在else代碼塊內自調用函數.我們前面有說到遞歸的過程是存在前行和退回階段的,那麼在前行階段我們在每次調用函數後,打印出了”抱着”,並且當n!=1時重新調用該函數。n==1時,可以理解爲遇見了一堵牆無路可走,執行System.out.print("我的抱枕");,開始進入回退階段,在退回階段,將會去執行代碼System.out.print("的我");
最終輸出: 我激動地抱住抱着抱着我的抱枕的我的我

  • **前行階段和回退階段圖示:

遞歸過程圖示

3.應用:

舉幾個我最近寫的題吧

1.合法括號

輸出 n個括號的 所有排列形式
1 ()
2 ()() , (())
3 ()()() , (()()) , ()(()) , (())() , ((()))

/*
n-的每個元素 都會有 左加 右加 外加 三種形式  
set集合自動去重
*/
 public static void main(String[] args) {
        System.out.println(creat(3));  //[()()(), (()()), ()(()), (())(), ((()))]
    }
    public static Set creat(int n){
        Set<String > s_n = new HashSet<>();
        if(n==1) {
            s_n.add("()");
            return s_n;
        }
        Set<String> s_n1 = creat(n - 1);
        for (String s : s_n1) {
            s_n.add(s+"()");
            s_n.add("()"+s);
            s_n.add("("+s+")");
        }
        return s_n;
    }

我們要求找出具有下列性質數的個數(包含輸入的自然數
先輸入一個自然數(n≤1000),然後對此自然數按照如下方法進行處理:
1.不作任何處理;
2.在它的左邊加上一個自然數,但該自然數不能超過原數的一半;
3.加上數後,繼續按此規則進行處理,直到不能再加自然數爲止.

輸入格式:
1個自然數n(n<=1000)
輸出格式:
1個整數,表示具有該形式的個數

6 6,16,26,126,36,136

6

/*
1
1  1
2
2 12     2 1+1 1 1+f(1)
3
3 13     2 1+1 1 1+f(1)
4
4 24 14 124     4   1+3 3=1+2 1+f(2)
5
5 25 15 125     4   1+3 3=1+2  1+f(2)
6
6,16,26,126,36,136  6  1+5  5=1+2+2 1+f(2)+f(3)
7
6 16 26 126 36 136  6  1+5  5=1+2+2 1+f(2)+f(3)
8
8 18 28 38 48 128 138 148 248 1248 1+9 9=1+2+2+4  1+f(2)+f(3)+f(4)
*/
public class exercise1 {
    public static void main(String[] args) {
        int n= new Scanner(System.in).nextInt();
         int count = method(n);
        System.out.println(count);
    }

    public static int method ( int temp) {
        if ( temp == 1)
           return  1;
        if(temp == 2)
            return 2;
        else
         return  method(temp/2)+method(temp-2);
    }

}

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