F1:  迭代法

最慢,复杂度最高

F2:  直接法

F3:  矩阵法

参考《算法之道(The Way of Algorithm)》第38页-魔鬼序列:斐波那契序列

F4:  通项公式法

由于公式中包含根号5,无法取得精确的结果,数字越大误差越大

 using System;
using System.Diagnostics; namespace Fibonacci
{
class Program
{
static void Main(string[] args)
{
ulong result; int number = ;
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 == || number == )
{
return ;
}
else
{
return F1(number - ) + F1(number - );
} } /// <summary>
/// 直接法
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
private static ulong F2(int number)
{
ulong a = , b = ;
if (number == || number == )
{
return ;
}
else
{
for (int i = ; 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[, ] { { , }, { , } };
ulong[,] b = MatirxPower(a, n);
return b[, ];
} #region F3
static ulong[,] MatirxPower(ulong[,] a, int n)
{
if (n == ) { return a; }
else if (n == ) { return MatirxMultiplication(a, a); }
else if (n % == )
{
ulong[,] temp = MatirxPower(a, n / );
return MatirxMultiplication(temp, temp);
}
else
{
ulong[,] temp = MatirxPower(a, n / );
return MatirxMultiplication(MatirxMultiplication(temp, temp), a);
}
} static ulong[,] MatirxMultiplication(ulong[,] a, ulong[,] b)
{
ulong[,] c = new ulong[, ];
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
for (int k = ; k < ; 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();
return (/sqrt5*(Math.Pow((+sqrt5)/,n)-Math.Pow((-sqrt5)/,n)));
}
}
}

n=50时

n=500

n=5000

n=50000

n=5000000

C# 4种方法计算斐波那契数列 Fibonacci的更多相关文章

  1. 使用并行的方法计算斐波那契数列 (Fibonacci)

    更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...

  2. 斐波那契数列-java编程:三种方法实现斐波那契数列

    题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...

  3. 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

    动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...

  4. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  5. 关于Haskell计算斐波那契数列的思考

    背景 众所周知,Haskell语言是一门函数式编程语言.函数式编程语言的一大特点就是数值和对象都是不可变的,而这与经常需要对状态目前的值进行修改的动态规划算法似乎有些"格格不入", ...

  6. Android NDK入门实例 计算斐波那契数列一生成jni头文件

    最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...

  7. 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)

    先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...

  8. shell脚本计算斐波那契数列

    计算斐波那契数列 [1,1,2,3,5,8,,,,,] #!/bin/bash n=$ num=( ) i= while [[ $i -lt $n ]] do let num[$i]=num[$i-] ...

  9. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

随机推荐

  1. CVE-2018-8420 漏洞复现

    影响的 Windows 版本: Microsoft Windows 10 Version 1607 for 32-bit SystemsMicrosoft Windows 10 Version 160 ...

  2. python的with用法(参考)

    一.With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中 ...

  3. ubantu的下载和在虚拟机VM中的安装

    一.下载Ubuntu镜像文件 下载地址:http://www.ubuntu.com 打开上面的连接,我们来到如下页面,点击download: 下一步,到如下页面,点击Ubuntu Desktop: 然 ...

  4. 运维基础工具tmux介绍及使用

    一.tmux是干什么的? 百度百科的解释很到位:tmux是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件. 说白了就是复用软件,复用的什么软件呢? 你可以理解成复用shel ...

  5. 取消Eclipse的Error Reporting

    选择Preferences->General->Error Reporting,Send Mode选择Never send reports

  6. 设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)

    转自http://unmi.cc/uilable-uitextfield-padding-insets 主要是理解下UIEdgeInsets在IOS UI里的意义. 靠,这货其实就是间隔,起个名字这么 ...

  7. C++中public、protected以及private的使用

    相比C语言,C++中通过class/struct来定义既包含数据,又包含行为的结构,从而支持了“对象”.现实世界中,一个人(一个对象)通常 拥有一些资产(数据),并且掌握某些技能(行为),并且这些资产 ...

  8. mybatis框架中的输入映射

    mybatis.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 输入类型: 1.传递简单类型 可以参考我之前的对于数据库增删改查的博文. ...

  9. 主线程不能直接调用webservice方法

    @Overrideprotected void onCreate(Bundle savedInstanceState){//StrictMode.setThreadPolicy(new StrictM ...

  10. java通过经纬度计算两个点的之间的距离的算法

    通过两个点的经纬度计算距离 从google maps的脚本里扒了段代码,没准啥时会用上.大家一块看看是怎么算的. private const double EARTH_RADIUS = 6378.13 ...