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个斐 ...
随机推荐
- 给iOS开发新手送点福利,简述UIControl事件的用法
UIControl事件 1.UIControlEventTouchDown 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候. 2.UIControlEventTouchDownRepeat ...
- bootstrap的引入和使用
Bootstrap的下载 一. 使用Bootstrap第一步,先将生成环境的Bootstrap下载下来.然后将下载,然后引入到自己建好的当前目录中 二.点到起步中的基本模板 将看到的整段代码复制粘贴到 ...
- MySQL 通用查询日志(General Query Log)
同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分.MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志可以帮助我们定位mysql ...
- SQL 基础命令和函数
[数据操作] SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 [数据定义] C ...
- struts2配置默认首页
配置struts2 默认欢迎页的几种办法: 1.首先需要明确的是struts过滤器配置映射的模式是路径匹配还是扩展匹配,如果url-pattern配置为/*,如果不做特殊处理,是不会转到welcome ...
- typedef用法和与define的区别
typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍typed ...
- Selection II
[Selection II] 1.上.下.左.右键可以移动Selection 1个像素.按住Shift键,可以一次移动10个像素. 2.Add Selection模式的快捷键是Shift,Sub Se ...
- Unity Editor(一)OnInspectorGUI的重写与面板的创建
http://blog.csdn.net/husheng0/article/details/52568027
- Going Home(最小费用最大流)
Going Home http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Total Submission ...
- 最大正方形 · Maximal Square
[抄题]: 在一个二维01矩阵中找到全为1的最大正方形 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 返回 4 [暴力解法]: 时间分析: 空间分析:i j 中保留一 ...