一、莱昂纳多·斐波那契(Leonardo Fibonacci)
斐波那契公元1170年生于意大利比萨,卒于1250年,被人称作“比萨的莱昂纳多”,是一名闻名于欧洲的数学家,其主要的著作有《算盘书》、《实用几何》和《四艺经》等。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点于阿尔及利亚地区,莱昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。
二、斐波那契数列(Fibonacci Sequence)
在1202年斐波那契提出了一个非常著名的数列,即:
假设一对兔子每隔一个月生一对一雌一雄的小兔子,每对小兔子在两个月以后也开始生一对一雌一雄的小兔子,每月一次,如此下去。年初时兔房里放一对大兔子,问一年以后,兔房内共有多少对兔子?
斐波那契数列(Fibonacci Sequence)指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始,每一项都等于前两项之和。
斐波那契数列由意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci)定义。
斐波那契数列(Fibonacci Sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
三、斐波那契数列的算法
公式:
F(n)=F(n−1)+F(n−2)
计算结果:
源程序:
using System;namespace Legalsoft.Truffer.Algorithm
{public static partial class Number_Sequence{/// <summary>/// 斐波那契数列的原始(递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number(int n){if (n <= 1){return n;}else{return Fibonacci_Number(n - 1) + Fibonacci_Number(n - 2);}}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Second(int n){int[] f = new int[n + 2];f[0] = 0;f[1] = 1;for (int i = 2; i <= n; i++){f[i] = f[i - 1] + f[i - 2];}return f[n];}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Third(int n){if (n <= 0){return 0;}int a = 0;int b = 1;for (int i = 2; i <= n; i++){int c = a + b;a = b;b = c;}return b;}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Fourth(int n){int[,] F = new int[2, 2] { { 1, 1 }, { 1, 0 } };if (n <= 0){return 0;}Fib4_Power(ref F, n - 1);return F[0, 0];}/// <summary>/// 2x2矩阵乘法/// </summary>/// <param name="F"></param>/// <param name="M"></param>static void Fib_Multiply(ref int[,] F, int[,] M){int x = F[0, 0] * M[0, 0] + F[0, 1] * M[1, 0];int y = F[0, 0] * M[0, 1] + F[0, 1] * M[1, 1];int z = F[1, 0] * M[0, 0] + F[1, 1] * M[1, 0];int w = F[1, 0] * M[0, 1] + F[1, 1] * M[1, 1];F[0, 0] = x;F[0, 1] = y;F[1, 0] = z;F[1, 1] = w;}/// <summary>/// 求幂/// </summary>/// <param name="F"></param>/// <param name="n"></param>static void Fib4_Power(ref int[,] F, int n){int[,] M = new int[2, 2] { { 1, 1 }, { 1, 0 } };for (int i = 2; i <= n; i++){Fib_Multiply(ref F, M);}}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Fifth(int n){if (n <= 0){return 0;}int[,] F = new int[2, 2] { { 1, 1 }, { 1, 0 } };Fib5_Power(ref F, n - 1);return F[0, 0];}/// <summary>/// 求幂方法的改进/// </summary>/// <param name="F"></param>/// <param name="n"></param>private static void Fib5_Power(ref int[,] F, int n){if (n == 0 || n == 1){return;}int[,] M = new int[,] { { 1, 1 }, { 1, 0 } };Fib5_Power(ref F, n / 2);Fib_Multiply(ref F, F);if (n % 2 != 0){Fib_Multiply(ref F, M);}}private static int MAX { get; set; } = 1000;private static int[] pool { get; set; } = null;/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Sixth(int n){if (pool == null){pool = new int[MAX];}if (n <= 0){return 0;}if (n == 1 || n == 2){return (pool[n] = 1);}if (pool[n] != 0){return pool[n];}int k = ((n & 1) == 1) ? ((n + 1) / 2) : (n / 2);int k1 = Fibonacci_Number_Sixth(k - 1);int k2 = Fibonacci_Number_Sixth(k);int b1 = (k2 * k2 + k1 * k1);int b2 = (2 * k1 + k2) * k2;pool[n] = ((n & 1) == 1) ? b1 : b2;//f[n] = (n & 1) == 1 ? (fib(k) * fib(k) +// fib(k - 1) * fib(k - 1))// : (2 * fib(k - 1) + fib(k)) *// fib(k);return pool[n];}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Seventh(int n){double phi = (1 + Math.Sqrt(5)) / 2;return (int)Math.Round(Math.Pow(phi, n) / Math.Sqrt(5));}/// <summary>/// 斐波那契数列的改进(非递归)算法/// </summary>/// <param name="n"></param>/// <returns></returns>public static int Fibonacci_Number_Eighth(int n){if (pool == null){pool = new int[MAX];}if (n <= 1){return n;}int first;int second;if (pool[n - 1] != -1){first = pool[n - 1];}else{first = Fibonacci_Number_Eighth(n - 1);}if (pool[n - 2] != -1){second = pool[n - 2];}else{second = Fibonacci_Number_Eighth(n - 2);}pool[n] = first + second;return pool[n];}}
}
——————————————————————————
POWER BY TRUFFER.CN