C# 4种方法计算斐波那契数列 Fibonacci
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的更多相关文章
- 使用并行的方法计算斐波那契数列 (Fibonacci)
更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...
- 斐波那契数列-java编程:三种方法实现斐波那契数列
题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...
- 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)
动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...
- java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列
什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...
- 关于Haskell计算斐波那契数列的思考
背景 众所周知,Haskell语言是一门函数式编程语言.函数式编程语言的一大特点就是数值和对象都是不可变的,而这与经常需要对状态目前的值进行修改的动态规划算法似乎有些"格格不入", ...
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)
先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...
- shell脚本计算斐波那契数列
计算斐波那契数列 [1,1,2,3,5,8,,,,,] #!/bin/bash n=$ num=( ) i= while [[ $i -lt $n ]] do let num[$i]=num[$i-] ...
- python实现斐波那契数列(Fibonacci sequence)
使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...
随机推荐
- setAttribute第三个参数
object.setAttribute(sName, vValue [, iFlags]) sName参数应是Dom属性而非html中的属性.Dom中Html专有的接口属性应该以小写字母开头,如果属性 ...
- hue database is locked
hue使用mysql作为元数据库 hue默认使用sqlite作为元数据库,不推荐在生产环境中使用.会经常出现database is lock的问题. 解决方法: 其实官网也有解决方法,不过过程似乎有点 ...
- gpg的使用
[gpg的使用] 在Linux系统中,gpg程序可以实现非对称加密. 下面简单介绍gpg命令的用法:一.创建密钥:$ gpg --gen-key Please select what kind of ...
- awk使用
[awk使用] 例:awk -F ':' '{print $1"\t"$7}' 参考:http://www.cnblogs.com/ggjucheng/archive/2013/0 ...
- transform.rotation和GetComponent<Rigidbody>().MoveRotation
同时在UPDATE和FIXED UPDATE中调整 旋转 并未出现闪,而是一直以UPDATE中的为准,可认为MoveRotation调用后在UPDATE中生效 using System.Collect ...
- input checkbox 复选框大小修改
设置zoom属性(放大) 利用style: <input type="checkbox" name="returnfee" style="zo ...
- jquey下eq()的使用注意事项
写在开始的话: 今天在公司路经同事工位,发现在写jquery代码,刚好遇见一个bug,于是驻足看了一会,发现了jq遍历方法中eq()的使用的一个容易犯错的地方. 同事的代码大概意思是这样的: < ...
- 打劫房屋 · House Robber
[抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...
- Linux运维实战之DNS(bind)服务器的安装与配置
转自http://sweetpotato.blog.51cto.com/533893/1598225 上次博文我们讨论了DNS的基础,本次博文我们重点来看看如何配置一台DNS服务器. [本次博文的主要 ...
- 8-@Pointcut( "execution(* com.ctgu.controller.AccountController.transfer(..))" ) 拦截配置问题
@pointcut()可以直接指定到某个包下的某个类的某个方法上: