C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码

一、莱昂纳多·斐波那契(Leonardo Fibonacci)

C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码_第1张图片

斐波那契公元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)(≥ 2,∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

三、斐波那契数列的算法

公式:

F(n)=F(n−1)+F(n−2)

计算结果:

C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码_第2张图片

 源程序:

using System;

namespace Legalsoft.Truffer.Algorithm
{
	public static partial class Number_Sequence
	{
		/// 
		/// 斐波那契数列的原始(递归)算法
		/// 
		/// 
		/// 
		public static int Fibonacci_Number(int n)
		{
			if (n <= 1)
			{
				return n;
			}
			else
			{
				return Fibonacci_Number(n - 1) + Fibonacci_Number(n - 2);
			}
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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];
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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;
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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];
		}

		/// 
		/// 2x2矩阵乘法
		/// 
		/// 
		/// 
		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;
		}

		/// 
		/// 求幂
		/// 
		/// 
		/// 
		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);
			}
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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];
		}

		/// 
		/// 求幂方法的改进
		/// 
		/// 
		/// 
		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;

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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];
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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));
		}

		/// 
		/// 斐波那契数列的改进(非递归)算法
		/// 
		/// 
		/// 
		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

你可能感兴趣的:(C#算法演义,Algorithm,Recipes,C#,算法,斐波那契数列,Fibonacci)