一列數的規則以下: 一、一、二、三、五、八、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; }
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項開始,每一項都等於前兩項之和。