Java方法遞歸(含詳解)

方法遞歸

遞歸很熟悉了,我們再來談談遞歸。

定義: 一個方法在執行過程中調用自身, 就稱爲 “遞歸”.

遞歸,相當於數學上的 “數學歸納法”, 有一個起始條件, 然後有一個遞推公式. 例如, 我們求 N! 起始條件: N = 1 的時候, N! 爲 1. 這個起始條件相當於遞歸的結束條件.

遞歸公式: 求 N! , 直接不好求, 可以把問題轉換成 N! => N * (N-1)

舉例:

1.遞歸求 N 的階乘
class FactorialSum{
    public int factorialsum(int x){
        if(x==1){
            return 1;
        }
        return x*factorialsum(x-1);
    }
}

這裏分析一下這個吧:

class FactorialSum{
    public int factorialsum(int x){
        System.out.println("函數開始, x = " + x); 
        if(x==1){
            return 1;
        }
        int ret=x*factorialsum(x-1);
        System.out.println("函數結束, x = " + x + " ret = " + ret); 
        return ret;
    }
}

運行結果:
在這裏插入圖片描述在這裏插入圖片描述如圖:一層一層的深入,直到x值等於1,return ret的值就爲1,
返回上一層,ret=21,返回ret=2;
返回上一層,ret=3
2,返回ret=6;
返回上一層,ret=46,返回ret=24;
返回最後一層,ret=5
24,返回ret=120;

2.遞歸求 1 + 2 + 3 + … + 10
class SequenceSum{
    public int sequencesum(int x){
        if(x==1){
            return 1;
        }
        return x+sequencesum(x-1);
    }
}

這樣理解,終止條件爲 1,如果到1了就返回上一層,那麼;
10 !=1 進入10+sequencesum(9);
9 !=1 進入9+sequencesum(8);
.
.
.
1==1 返回上一層,並且sequensum(1)=1 (ps:最深層次);
開始返回上一層
1+2=3 返回上一層 ,並且sequensum(2)=3
.
.
.
10+sequencesum(9)=10+45=55
返回 55

3.按順序打印一個數字的每一位
class SequencePrint{
    public void sequenceprint(int x){
        if(x>9){
            sequenceprint(x/10);
        }
        System.out.println(x%10);
    }
}

這裏我輸入的是1234;
1234>9 進入sequence(1234/10)=sequence(123);
123>9 進入sequence(123/10)=sequence(12);
12>9 進入sequence(12/10)=sequence(1);
1<9 Sysout(1%10) 即1,並返回上一層;
Sysout(12%10) 即2,並返回上一層;
Sysout(123%10) 即3,並返回上一層;
Sysout(1234%10) 即4,結束。

4.寫一個遞歸方法,輸入一個非負整數,返回組成它的數字之和.
class SequenceNumSum{
        public int sequencenumsum(int x){
            if(x<10){
               return x;
            }
           
            return x%10+sequencenumsum(x/10);
        }
    }

很簡單,輸入1234
1234>10 return 4+sequencenumsum(123);
123>10 return 3+sequencenumsum(12);
12>10 return 2+sequencenumsum(1);
1<10 return 1;
返回 2+1 返回3;
返回 3+3 返回6;
返回 4+6 返回10 結束

遞歸有點像盜夢空間,必須一層一層的依次深入,回退的話也是一層一層的倒退,不能瞎**跳,夢中夢,遞中遞,好好理解吧!

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