a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品视屏 | 99成人精品| 日韩手机在线 | 日本免费看片 | 一区二区三区四区视频 | 国产夜夜夜 | 免费看片色 | 久久久精品网站 | 北条麻妃国产九九九精品小说 | 中文字幕日韩一区二区不卡 | 簧片av | 精品久久久久久亚洲综合网站 | 免费在线看a | 国产精品久久久久久久免费大片 | 日韩精品一区二区三区第95 | 国产精品免费一区二区 | 91福利视频导航 | 精品亚洲一区二区三区四区五区 | 美国av一区二区三区 | 欧美成人午夜免费视在线看片 | 日韩在线视频网站 | 草逼网首页 | 日韩免费网站 | 暖暖视频日韩欧美在线观看 | 久久一区 | 欧美日本韩国一区二区三区 | 中文字幕在线观看免费视频 | 一区二区三区精品 | 在线不卡av | 国产精品亚洲精品日韩已方 | 成人精品视频99在线观看免费 | 亚洲欧洲无码一区二区三区 | 青青草国产成人av片免费 | 午夜视频在线观看免费视频 | 欧美三级在线 | 国产小视频在线播放 | 日韩av黄色| 99热影院 | 国产视频久久久久 | 久久久精品区 | h肉动漫无修一区二区无遮av |