什么是遞歸函數/方法?
任何一個方法既可以調用其他方法又可以調用自己,而當這個方法調用自己時,我們就叫它遞歸函數或者遞歸方法!
通常遞歸有兩個特點:
1.遞歸方法一直會調用自己直到某些條件滿足,也就是說一定要有出口;
2.遞歸方法會有一些參數,而它會把這些新的參數值傳遞給自己;(自己調自己);
遞歸通常用於: ①.階乘 ②.斐波拉切數列;
1.階乘
階乘(!)是小於某個數的所有正整數的乘積;
注意:0既不是正整數,又不是負整數;0是整數;
0!=1
1!=1
2!=2*1!=2
3!=3*2!=6
4!=4*3!=24
5!=5*4!=120
...
n!=n*(n-1)!
下面是計算階乘的一種實現方法(沒有使用遞歸):
1 public long Factorial(int n){ 2 3 if(n==0) 4 5 return 1; 6 7 long value=1; 8 9 for(int i=n;i>0;i--){ 10 11 value*=i; 12 13 } 14 15 return value; 16 17 }
// 遞歸方法:
1 pubic long Factorial(int n){ 2 3 if(n==0){ 4 5 return 1; 6 7 return n*Factorial(n-1); 8 9 } 10 11 }
你知道的,n的階乘實際上就是n-1的階乘乘以n,且n>0;
它可以表示成Factorial(n)=Factorial(n-1)*n;
這是方法的返回值,但我們需要一個條件,也就是出口(注意:遞歸一定要有出口)
如果n=0則返回1;
現在這個程式的邏輯應該很清楚了,這樣我們就能夠輕易的理解了.
2.(Fibonacci)斐波拉切數列:
Fibonacci數列是按以下順序排列的數字:
1,1,2,3,5,8,13,21,34,55....
我們不難發現數列的排列規律是:后一個數加上前一個數,以此類推;
如果F0=0並且F1=1那么Fn=F(n-1)+F(n-2);
下面是計算Fabonacci數列的一種實現方法(沒有使用遞歸):
1 public long Fibonacci(int n){ 2 3 int a=1; 4 5 int b=1; 6 7 int n; // 聲明一個變量用來定義數列的長度; 8 9 for(int i=2;i<n;i++){ 10 11 b=a+b; // 得到b的值; 12 13 a=b-a; // 得到上一次a的值; 14 15 } 16 17 }
// 遞歸方法:
1 public long Fabinacci(int n){ 2 3 if(n==0||n==1){ // 滿足條件 4 5 return n; 6 7 } 8 9 return Fabinacci(i-2)+Fabinacci(i-2); // 返回值 10 11 }
我們通過排列發現,Fabonacci數列實際上就是后一個數加上前一個數的和
Fabonacci(n)=Fabonacci(n-2)+Fabonacci(n-1);
當數列元素從0開始排列時,滿足判斷條件得到返回值 n;
然后跳出進行下面語句,一直循環到滿足n的條件,跳出出口得到返回值Fabonacci(n);
總結:方法實現體內再次調用方法本身的本質是多個方法的簡寫;
它既可以調用其他方法,又可以調用自身.
遞歸一定要有出口;
例:
1 public void Func1(ref int num){ 2 3 if(num<3){ 4 5 num++; 6 7 Func2(ref num); 8 9 } 10 11 } 12 13 14 15 public void Func2(ref int num){ 16 17 if(num<3){ 18 19 num++; 20 21 Func3(ref num); 22 23 } 24 25 } 26 27 28 29 public void Func3(ref int num){ 30 31 if(num<3){ 32 33 num++; 34 35 Func4(ref num); 36 37 } 38 39 } 40 41
......
那么我們可以將上述方法直接簡寫:
1 public void Func(ref int num){ 2 3 if(num<3){ 4 5 num++; 6 7 Func(ref num); 8 9 } 10 11 }