這篇文章主要介紹了C#如何實(shí)現(xiàn)斐波那契數(shù)列,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)客戶idc服務(wù)中心,提供香港機(jī)房服務(wù)器托管、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開放、透明、穩(wěn)定、高性價(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。什么是斐波那契數(shù)列?經(jīng)典數(shù)學(xué)問題之一;斐波那契數(shù)列,又稱黃金分割數(shù)列,指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、……想必看到這個(gè)數(shù)列大家很容易的就推算出來后面好幾項(xiàng)的值,那么到底有什么規(guī)律,簡(jiǎn)單說,就是前兩項(xiàng)的和是第三項(xiàng)的值,用遞歸算法計(jì)第50位多少。
這個(gè)數(shù)列從第3項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和。
斐波那契數(shù)列:{1,1,2,3,5,8,13,21...}
遞歸算法,耗時(shí)最長(zhǎng)的算法,效率很低。
public static long CalcA(int n) { if (n <= 0) return 0; if (n <= 2) return 1; return checked(CalcA(n - 2) + CalcA(n - 1)); }
通過循環(huán)來實(shí)現(xiàn)
public static long CalcB(int n) { if (n <= 0) return 0; var a = 1L; var b = 1L; var result = 1L; for (var i = 3; i <= n; i++) { result = checked(a + b); a = b; b = result; } return result; }
通過循環(huán)的改進(jìn)寫法
public static long CalcC(int n) { if (n <= 0) return 0; var a = 1L; var b = 1L; for (var i = 3; i <= n; i++) { b = checked(a + b); a = b - a; } return b; }
通用公式法
////// F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n} /// /// ///public static long CalcD(int n) { if (n <= 0) return 0; if (n <= 2) return 1; //加上,可減少運(yùn)算。 var a = 1 / Math.Sqrt(5); var b = Math.Pow((1 + Math.Sqrt(5)) / 2, n); var c = Math.Pow((1 - Math.Sqrt(5)) / 2, n); return checked((long)(a * (b - c))); }
其他方法
using System; using System.Diagnostics; namespace Fibonacci { class Program { static void Main(string[] args) { ulong result; int number = 10; Console.WriteLine("************* number={0} *************", number); Stopwatch watch2 = new Stopwatch(); watch2.Start(); result = F1(number); watch2.Stop(); Console.WriteLine("F1({0})=" + result + " 耗時(shí):" + watch2.Elapsed, number); Stopwatch watch3 = new Stopwatch(); watch3.Start(); result = F2(number); watch3.Stop(); Console.WriteLine("F2({0})=" + result + " 耗時(shí):" + watch3.Elapsed, number); Stopwatch watch4 = new Stopwatch(); watch4.Start(); result = F3(number); watch4.Stop(); Console.WriteLine("F3({0})=" + result + " 耗時(shí):" + watch4.Elapsed, number); Stopwatch watch5 = new Stopwatch(); watch5.Start(); double result4 = F4(number); watch5.Stop(); Console.WriteLine("F4({0})=" + result4 + " 耗時(shí):" + watch5.Elapsed, number); Console.WriteLine(); Console.WriteLine("結(jié)束"); Console.ReadKey(); } ////// 迭代法 /// /// ///private static ulong F1(int number) { if (number == 1 || number == 2) { return 1; } else { return F1(number - 1) + F1(number - 2); } } /// /// 直接法 /// /// ///private static ulong F2(int number) { ulong a = 1, b = 1; if (number == 1 || number == 2) { return 1; } else { for (int i = 3; i <= number; i++) { ulong c = a + b; b = a; a = c; } return a; } } /// /// 矩陣法 /// /// ///static ulong F3(int n) { ulong[,] a = new ulong[2, 2] { { 1, 1 }, { 1, 0 } }; ulong[,] b = MatirxPower(a, n); return b[1, 0]; } #region F3 static ulong[,] MatirxPower(ulong[,] a, int n) { if (n == 1) { return a; } else if (n == 2) { return MatirxMultiplication(a, a); } else if (n % 2 == 0) { ulong[,] temp = MatirxPower(a, n / 2); return MatirxMultiplication(temp, temp); } else { ulong[,] temp = MatirxPower(a, n / 2); return MatirxMultiplication(MatirxMultiplication(temp, temp), a); } } static ulong[,] MatirxMultiplication(ulong[,] a, ulong[,] b) { ulong[,] c = new ulong[2, 2]; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { c[i, j] += a[i, k] * b[k, j]; } } } return c; } #endregion /// /// 通項(xiàng)公式法 /// /// ///static double F4(int n) { double sqrt5 = Math.Sqrt(5); return (1/sqrt5*(Math.Pow((1+sqrt5)/2,n)-Math.Pow((1-sqrt5)/2,n))); } } }
OK,就這些了。用的long類型來存儲(chǔ)結(jié)果,當(dāng)n>92時(shí)會(huì)內(nèi)存溢出。
C#是一個(gè)簡(jiǎn)單、通用、面向?qū)ο蟮木幊陶Z言,它由微軟Microsoft開發(fā),繼承了C和C++強(qiáng)大功能,并且去掉了一些它們的復(fù)雜特性,C#綜合了VB簡(jiǎn)單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程從而成為.NET開發(fā)的選語言,但它不適用于編寫時(shí)間急迫或性能非常高的代碼,因?yàn)镃#缺乏性能極高的應(yīng)用程序所需要的關(guān)鍵功能。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#如何實(shí)現(xiàn)斐波那契數(shù)列”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。