C#遞迴

Nincems發表於2018-11-19

轉自:https://www.cnblogs.com/fengjiulin110120/p/6681060.html

什麼是遞迴函式/方法?

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

通常遞迴有兩個特點:

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)!

下面是計算階乘的一種實現方法(沒有使用遞迴):

public long Factorial(int n){

      if(n==0)

         return 1;

     long value=1;

     for(int i=n;i>0;i--){

          value*=i;

     }

     return value;

 } 

// 遞迴方法:

pubic long Factorial(int n){

   if(n==0){

       return 1;

   return n*Factorial(n-1);

    }

}

你知道的,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數列的一種實現方法(沒有使用遞迴):

public long Fibonacci(int n){

      int a=1;

      int b=1;

      int n;  //  宣告一個變數用來定義數列的長度;

      for(int i=2;i<n;i++){

              b=a+b;    //  得到b的值;

              a=b-a;    //  得到上一次a的值;

       }

     }

//  遞迴方法:

public long Fabinacci(int n){

    if(n==0||n==1){  //  滿足條件

            return n;  

    }

    return Fabinacci(i-2)+Fabinacci(i-2);  //  返回值

    }

我們通過排列發現,Fabonacci數列實際上就是後一個數加上前一個數的和

Fabonacci(n)=Fabonacci(n-2)+Fabonacci(n-1);

當數列元素從0開始排列時,滿足判斷條件得到返回值 n;

然後跳出進行下面語句,一直迴圈到滿足n的條件,跳出出口得到返回值Fabonacci(n);

總結:方法實現體內再次呼叫方法本身的本質是多個方法的簡寫;

   它既可以呼叫其他方法,又可以呼叫自身.

   遞迴一定要有出口;

例:  

public void Func1(ref int num){

    if(num<3){

            num++;

            Func2(ref num);

    }

}



public void Func2(ref int num){

    if(num<3){

            num++;

            Func3(ref num);

    }

}



public void Func3(ref int num){

    if(num<3){

            num++;

            Func4(ref num);

    }

}

那麼我們可以將上述方法直接簡寫:

public void Func(ref int num){

     if(num<3){

         num++;

          Func(ref num);  

      }

 }

原文請見:https://www.cnblogs.com/fengjiulin110120/p/6681060.html

相關文章