C#遞歸


什么是遞歸函數/方法?


任何一個方法既可以調用其他方法又可以調用自己,而當這個方法調用自己時,我們就叫它遞歸函數或者遞歸方法!

 

通常遞歸有兩個特點:    


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 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM