一列數的規則以下: 一、一、二、三、五、八、1三、2一、34...... 求第30位數是多少, 用遞歸算法實現。

一列數的規則以下: 一、一、二、三、五、八、1三、2一、34...... 求第30位數是多少, 用遞歸算法實現
答:html

public class MainClass 
  { 
        public static void Main() 
        { 
                Console.WriteLine(Foo(30)); 
         } 
         public static int Foo(int i) 
         { 
              if (i <= 0) 
              return 0; 
              else if(i > 0 && i <= 2) 
              return 1; 
              else return Foo(i -1) + Foo(i - 2); 
          } 
    }

或者:算法

public int GetNumberAtPos(int pos)
        {
            if(pos==0||pos==1)
            {
                return 1;
            }
            int res = GetNumberAtPos(pos - 1) + GetNumberAtPos(pos - 2);
            return res;
        }

或者:函數

static int Fn1(int n)
        {
            if (n <= 0)
            {
                throw new ArgumentOutOfRangeException();
            }

            int a = 1;
            int b = 1;
            int c = 1;

            for (int i = 3; i <= n; i++)
            {
                c = checked(a + b); 
                a = b;
                b = c;
            }
            return c;
        }

不用遞歸:性能

static void Main(string[] args)
        {
            int[] num=new int[30];
            num[0]=1;
            num[1]=1;
            int first=num[0];
            int second=num[1];
            for (int i = 2; i < num.Length; i++)
            {
                num[i] = first + second;
                first = second;
                second = num[i];
            }
            Console.WriteLine(num[29]);
            Console.ReadLine();
        }

     
什麼是遞歸函數/方法?.net

任何一個方法既能夠調用其餘方法又能夠調用本身,而當這個方法調用本身時,咱們就叫它遞歸函數或者遞歸方法!code

一般遞歸有兩個特色: htm

1.遞歸方法一直會調用本身直到某些條件知足,也就是說必定要有出口;blog

2.遞歸方法會有一些參數,而它會把這些新的參數值傳遞給本身;(本身調本身);遞歸

遞歸問題要知足三個條件:ip

一個問題能夠分解成多個子問題的解;子問題就是規模更小的問題(邏輯不變
這些被分解的子問題,除了規模不同以外,解決思路同樣
存在條件來終止遞歸;這個好理解,由於本身調用本身總不能無線循環下去,因此必須有終止條件

遞歸解決方案對於複雜的開發來講很方便,並且十分強大,但因爲頻繁使用調用棧(call stack)可能會引發性能問題(有些時候性能極差)。

遞歸一般用於:  ①.階乘  ②.斐波拉切數列;

1.階乘

階乘(!)是小於某個數的全部正整數的乘積;注意:0既不是正整數,又不是負整數;0是整數;你知道的,n的階乘實際上就是n-1的階乘乘以n,且n>0;它能夠表示成Factorial(n)=Factorial(n-1)*n;這是方法的返回值,但咱們須要一個條件,也就是出口(注意:遞歸必定要有出口)若是n=0則返回1.

public long Fac(int n) 
{ 
if (n == 0)
return 1; 
return n * Fac(n - 1); 
}

不用遞歸:

public long Fac(int n) 
{ 
if (n == 0) 
return 1; 
long value = 1; 
for (int i = n; i > 0; i--) 
{ 
value *= i; 
} 
return value; 
}

C#遞歸算法計算階乘的方法

2.(Fibonacci)斐波拉切數列:

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda
Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」,指的是這樣一個數列:一、一、二、三、五、八、1三、2一、3四、……在數學上,斐波納契數列以以下被以遞推的方法定義:F(1)=1,F(2)=1,
F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,爲此,美國數學會從1963年起出版了以《斐波納契數列季刊》爲名的一份數學雜誌,用於專門刊載這方面的研究成果。

斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

這個數列從第3項開始,每一項都等於前兩項之和。

斐波那契數列算法的三種C#實現及時間複雜度分析

相關文章
相關標籤/搜索