方法遞歸
遞歸很熟悉了,我們再來談談遞歸。
定義: 一個方法在執行過程中調用自身, 就稱爲 “遞歸”.
遞歸,相當於數學上的 “數學歸納法”, 有一個起始條件, 然後有一個遞推公式. 例如, 我們求 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=32,返回ret=6;
返回上一層,ret=46,返回ret=24;
返回最後一層,ret=524,返回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 結束
遞歸有點像盜夢空間,必須一層一層的依次深入,回退的話也是一層一層的倒退,不能瞎**跳,夢中夢,遞中遞,好好理解吧!