国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現斐波那契數列的幾種方法整理

2019-10-29 19:59:08
字體:
來源:轉載
供稿:網友

什么是斐波那契數列?經典數學問題之一;斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……想必看到這個數列大家很容易的就推算出來后面好幾項的值,那么到底有什么規律,簡單說,就是前兩項的和是第三項的值,用遞歸算法計第50位多少。

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

斐波那契數列:{1,1,2,3,5,8,13,21...}

遞歸算法,耗時最長的算法,效率很低。

public static long CalcA(int n){  if (n <= 0) return 0;  if (n <= 2) return 1;  return checked(CalcA(n - 2) + CalcA(n - 1));}

通過循環來實現

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;}

通過循環的改進寫法

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;}

通用公式法

/// <summary>/// F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}/// </summary>/// <param name="n"></param>/// <returns></returns>public static long CalcD(int n){  if (n <= 0) return 0;  if (n <= 2) return 1; //加上,可減少運算。  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 watch1 = new Stopwatch();      watch1.Start();      result = F1(number);      watch1.Stop();      Console.WriteLine("F1({0})=" + result + " 耗時:" + watch1.Elapsed, number);      Stopwatch watch2 = new Stopwatch();      watch2.Start();      result = F2(number);      watch2.Stop();      Console.WriteLine("F2({0})=" + result + " 耗時:" + watch2.Elapsed, number);      Stopwatch watch3 = new Stopwatch();      watch3.Start();      result = F3(number);      watch3.Stop();      Console.WriteLine("F3({0})=" + result + " 耗時:" + watch3.Elapsed, number);      Stopwatch watch4 = new Stopwatch();      watch4.Start();      double result4 = F4(number);      watch4.Stop();      Console.WriteLine("F4({0})=" + result4 + " 耗時:" + watch4.Elapsed, number);      Console.WriteLine();      Console.WriteLine("結束");      Console.ReadKey();    }    /// <summary>    /// 迭代法    /// </summary>    /// <param name="number"></param>    /// <returns></returns>    private static ulong F1(int number)    {      if (number == 1 || number == 2)      {        return 1;      }      else      {        return F1(number - 1) + F1(number - 2);      }          }    /// <summary>    /// 直接法    /// </summary>    /// <param name="number"></param>    /// <returns></returns>    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;      }    }    /// <summary>    /// 矩陣法    /// </summary>    /// <param name="n"></param>    /// <returns></returns>    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    /// <summary>    /// 通項公式法    /// </summary>    /// <param name="n"></param>    /// <returns></returns>    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類型來存儲結果,當n>92時會內存溢出。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁阳县| 定结县| 旌德县| 石屏县| 广元市| 桃源县| 子长县| 绍兴县| 白河县| 康保县| 兴安县| 南部县| 射洪县| 三亚市| 广南县| 崇州市| 铜川市| 海口市| 茶陵县| 兴义市| 施甸县| 德兴市| 正镶白旗| 榆社县| 宣化县| 望奎县| 剑川县| 古浪县| 东至县| 阿城市| 邵东县| 长乐市| 崇明县| 隆尧县| 西乌珠穆沁旗| 尤溪县| 佳木斯市| 溆浦县| 南和县| 永安市| 威海市|