C# 4种方法计算斐波那契数列 Fibonacci

F1:  迭代法

最慢,复杂度最高

F2:  直接法

F3:  矩阵法

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

F4:  通项公式法

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

  1 using System;
  2 using System.Diagnostics;
  3
  4
  5 namespace Fibonacci
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             ulong result;
 12
 13             int number = 10;
 14             Console.WriteLine("************* number={0} *************", number);
 15
 16             Stopwatch watch1 = new Stopwatch();
 17             watch1.Start();
 18             result = F1(number);
 19             watch1.Stop();
 20             Console.WriteLine("F1({0})=" + result + "  耗时:" + watch1.Elapsed, number);
 21
 22             Stopwatch watch2 = new Stopwatch();
 23             watch2.Start();
 24             result = F2(number);
 25             watch2.Stop();
 26             Console.WriteLine("F2({0})=" + result + "  耗时:" + watch2.Elapsed, number);
 27
 28             Stopwatch watch3 = new Stopwatch();
 29             watch3.Start();
 30             result = F3(number);
 31             watch3.Stop();
 32             Console.WriteLine("F3({0})=" + result + "  耗时:" + watch3.Elapsed, number);
 33
 34             Stopwatch watch4 = new Stopwatch();
 35             watch4.Start();
 36             double result4 = F4(number);
 37             watch4.Stop();
 38             Console.WriteLine("F4({0})=" + result4 + "  耗时:" + watch4.Elapsed, number);
 39
 40             Console.WriteLine();
 41
 42             Console.WriteLine("结束");
 43             Console.ReadKey();
 44         }
 45
 46         /// <summary>
 47         /// 迭代法
 48         /// </summary>
 49         /// <param name="number"></param>
 50         /// <returns></returns>
 51         private static ulong F1(int number)
 52         {
 53             if (number == 1 || number == 2)
 54             {
 55                 return 1;
 56             }
 57             else
 58             {
 59                 return F1(number - 1) + F1(number - 2);
 60             }
 61
 62         }
 63
 64         /// <summary>
 65         /// 直接法
 66         /// </summary>
 67         /// <param name="number"></param>
 68         /// <returns></returns>
 69         private static ulong F2(int number)
 70         {
 71             ulong a = 1, b = 1;
 72             if (number == 1 || number == 2)
 73             {
 74                 return 1;
 75             }
 76             else
 77             {
 78                 for (int i = 3; i <= number; i++)
 79                 {
 80                     ulong c = a + b;
 81                     b = a;
 82                     a = c;
 83                 }
 84                 return a;
 85             }
 86         }
 87
 88         /// <summary>
 89         /// 矩阵法
 90         /// </summary>
 91         /// <param name="n"></param>
 92         /// <returns></returns>
 93         static ulong F3(int n)
 94         {
 95             ulong[,] a = new ulong[2, 2] { { 1, 1 }, { 1, 0 } };
 96             ulong[,] b = MatirxPower(a, n);
 97             return b[1, 0];
 98         }
 99
100         #region F3
101         static ulong[,] MatirxPower(ulong[,] a, int n)
102         {
103             if (n == 1) { return a; }
104             else if (n == 2) { return MatirxMultiplication(a, a); }
105             else if (n % 2 == 0)
106             {
107                 ulong[,] temp = MatirxPower(a, n / 2);
108                 return MatirxMultiplication(temp, temp);
109             }
110             else
111             {
112                 ulong[,] temp = MatirxPower(a, n / 2);
113                 return MatirxMultiplication(MatirxMultiplication(temp, temp), a);
114             }
115         }
116
117         static ulong[,] MatirxMultiplication(ulong[,] a, ulong[,] b)
118         {
119             ulong[,] c = new ulong[2, 2];
120             for (int i = 0; i < 2; i++)
121             {
122                 for (int j = 0; j < 2; j++)
123                 {
124                     for (int k = 0; k < 2; k++)
125                     {
126                         c[i, j] += a[i, k] * b[k, j];
127                     }
128                 }
129             }
130             return c;
131         }
132         #endregion
133
134         /// <summary>
135         /// 通项公式法
136         /// </summary>
137         /// <param name="n"></param>
138         /// <returns></returns>
139         static double F4(int n)
140         {
141             double sqrt5 = Math.Sqrt(5);
142             return (1/sqrt5*(Math.Pow((1+sqrt5)/2,n)-Math.Pow((1-sqrt5)/2,n)));
143         }
144     }
145 }

n=50时

n=500

n=5000

n=50000

n=5000000

原文地址:https://www.cnblogs.com/zhaoliankun/p/9149555.html

时间: 2024-10-10 10:39:01

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

两种方法递归斐波那契数列

__author__ = 'hechangting' #ecoding=utf-8 import itertools #迭代器 class Fib: def __init__(self): self.prev = 0 self.curr = 1 def __iter__(self): return self def __next__(self): value = self.curr self.curr += self.prev self.prev = value return value #生成

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

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

用递归法计算斐波那契数列的第n项

   斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. [Fibonacci.cpp] #include<iostream>#

计算斐波那契数列的性能对比:Python,Java,Go

??本文采用递归办法来计算斐波那契数列中的第38项,用于对于三种计算机语言的计算性能,这三种语言为:Python,Java,Go. ??我们采用递归法来求解斐波那契数列的第n项f(n),其算法描述如下: function fib(n) if n = 0 return 0 if n = 1 return 1 return fib(n ? 1) + fib(n ? 2) 对于公平起见,我们利用三种程序计算f(38),运行100遍,得到平均耗时,作为性能对比. ??Python程序如下: # -*-

使用递归,计算斐波那契数列

使用递归,计算斐波那契数列 function fib(num) { if (num > 2) { return fib(num - 2) + fib(num - 1); } else { return 1; } } fib(6) 运行过程 1. return fib(4)+fib(5) 2.return fib(2)+fib(3)+fib(3)+fib(4) 3.return 1+fib(1)+fib(2)+fib(1)+fib(2)+fib(2)+fib(3) 4.return 1+1+1+1

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

先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,指的是这样一个数列:1.1.2.3.5.8.13.21.34...这个数列从第3项开始,每一项都等于前两项之和. 根据以上定义,用python定义一个函数,用于计算斐波那契数列中第n项的数字是多少: def fib_recur(n): if n==0 or n==1 : r

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

使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐波那契数字.例如,1返回1 6返回8 我选择了两种方法,一种是将list变成一个队列,另一个则是使用环形队列.不多说,直接上代码:后面我会对为什么这样实现做一个解释 第一个是使用队列的方式: 1 def fibonacciSeq(num): 2 fibonacciSeqList = [] 3 for

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Python计算斐波那契数列

利用Python计算第一个达到一百万位数的斐波那契数列各位数之和 结果为4501552 以下是我用到的代码,不是中间需要一些人工操作来加快收敛性,有兴趣读者可以写代码加快收敛 首先执行这个,可以大致确定一百万个数所在斐波那契序列的位置 i=1 j=1 k=i+j count=3 while count<4850000: i=j j=k k=i+j count+=1 result=str(k) print('k长度') k_len=len(result) print(k_len) sum=0 fo