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

article/2025/7/28 3:56:42

一、莱昂纳多·斐波那契(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)(≥ 2,∈ 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


http://chatgpt.dhexx.cn/article/Ri5Smxic.shtml

相关文章

matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序

斐波那契数列数列从第3项开始,每一项都等于前两项之和。 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 应用: 生活斐波那契 斐波那契数列中的斐波脾气有点大,表面温和到别人误以为很好欺…

快速计算斐波那契数列(Fibonacci数列)

本文最后更新于 619 天前&#xff0c;其中的信息可能已经有所发展或是发生改变。 题目描述 输入一个正整数n&#xff0c;求Fibonacci数列的第n个数。Fibonacci数列的特点&#xff1a;第1,2个数为1,1。从第3个数开始&#xff0c;概述是前面两个数之和。即&#xff1a; 要求输入的…

递归求斐波那契数列

斐波那契数列 题目描述&#xff1a;编写一个函数&#xff0c;求斐波那契数列的第n项的值。 首先&#xff0c;对于斐波那契数列&#xff0c;我们是非常熟悉了&#xff0c;对斐波那契定义为如下&#xff1a;f(0)0,f(1)0,f(2)1,……f(n)f(n-1)f(n-2)&#xff0c;其中n>1。对于这…

斐波那契数列(Fibonacci)

有一对兔子&#xff0c;出生后第3个月起每个月都生一对免子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死&#xff0c;问40个月的免子总数为多少?解题思路&#xff1a; 这是一个有趣的古典数学问题。可以从表1看出兔子繁殖的规律。 …

【递归 动态规划 备忘录法】Fibonacci数列(斐波那契数列)(C++)

一、什么是Fibonacci数列 斐波那契数列指的是这样一个数列&#xff1a;1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…用文字来说&#xff0c;就是从第3项开始&#xff0c;每一项都等于前两项之和。至于包不包括0&#xff0c;一番查阅后没有得到证实… 不过重要的是“第3项开始…

算法-斐波那契数列Fibonacci

斐波那契数列 Fibonacci 斐波那契数列是这样的数列: 0、1、1、2、3、5, 8、13、21、34 …… 下一项是上两项的和。 2 是上两项的和(1+1) 3 是上两项的和(1+2)、 5 是(2+3)、 依此类推! 更多有意思的介绍可以见参考链接; 算法 1. 直接递归 初步想法就是采用递归的…

回顾斐波那契数列

一 概述 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列。该数列是指递归方法定义为&#xff1a; F(0) 0&#xff0c;F(0) 1&#xff0c;F(n) F(n-1) F(n-2) (n ≥ 2&#xff0c;n ∈ N*) 的数列。 具体表现形式为&#xff1a;0&am…

题:斐波那契数列(Fibonacci数列)——一个数最少几步变成斐波那契数列的数

题目描述&#xff1a; Fibonacci数列就形如&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, ...&#xff0c;在Fibonacci数列中的数我们称为Fibonacci数。给你一 个N&#xff0c;你想让其变为一个Fibonacci数&#xff0c;每一步你可以把当前数字X变为X-1或者X1&#xff0c;现在给你一个…

Fibonacci数列前20项(斐波那契数列)

HZKs Blog 本文标题&#xff1a; Fibonacci数列前20项(斐波那契数列) 本文链接&#xff1a; https://blog.zekun.fun/2021/coding/cppfibonacci数列前20项斐波那契数列/ 题目描述 Fibonacci数列的特点&#xff1a;第1,2个数为1,1。从第3个数开始&#xff0c;概述是前面两个数之…

for_each函数用法

Introduction 學習過STL的container後&#xff0c;想要存取每一個iterator&#xff0c;你一定寫過以下的程式 #include < vector > #include < iostream > using namespace std; int main() { int ia[] {1, 2, 3}; vector<int> ivec(ia, ia size…

each函数用法

<?php/*each()只是一个函数&#xff0c;参数就是一个数组&#xff0c;返回的值也是一个数组1.返回的值也是一个数组&#xff0c;数组固定有4个元素&#xff0c;而且下标也是固定的1(值) value(值) 0(下标) key(下标)2.each()只是处理当前的元素将当前的元素(默认当前元素是…

$.each的用法

1、示例1&#xff1a; <script type"text/javascript">var arr["1","2","3"];<span style"white-space:pre"> </span>//定义arr数组$.each(arr, function() {alert(this);<span style"white-spac…

for_each用法示例

文章目录 前言示例demo 前言 由于偶然间发现for_each能使得避免使用for循环&#xff0c;大大简化了代码。这里简单记录下for_each的一个简单示例demo,方便温习。 示例demo #include <iostream> #include "vector" #include "algorithm"void myfun…

字长、字节、字、字位的区别

字长、字节、字、字位的区别&#xff1a; &#xff08;1&#xff09;概念不一样 同一时间处理二进制数位数叫字长&#xff0c;字长是直接用二进制代码指令表达的计算机语言。 字节&#xff08;Byte &#xff09;是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;…

微型计算机一个汉字多少字节,一个汉字多少字节(Byte)?

2006-01-07 一个汉字有几个字节&#xff1f; 依据编码形式&#xff1a; GB&#xff0d;231280 编码为 2个字节(Byte) 包含了 20902 个汉字&#xff0c;其编码范围是 0x8140-0xfefe。 GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字&#xff0c;增加了藏、蒙等少数民族的…

计算机中1kb等于多少字节,在计算机中1kb等于多少字节

在计算机中1kb等于1024个字节。字节是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;也表示一些计算机编程语言中的数据类型和语言字符。一个字节存储8位无符号数。 本文操作环境&#xff1a;windows10系统、thinkpad t480电脑。 (学习视频分享&#xff1a;编程视频…

使用Java8新特性对List进行排序

前言&#xff1a; 在项目开发中往往会遇到各种数据需要排序展示在页面上&#xff0c;常见的从数据库查使用数据库的排序&#xff0c;还有一种就是使用我们的开发语言进行排序&#xff0c;这里给大家演示使用java8的新特性进行排序&#xff0c;众所周知java8带来了函数式编程和…

java8特性之forEach篇

java8特性之forEach篇 forEach介绍使用条件迭代原理性能 forEach介绍 forEach是java8的特性之一&#xff0c;它可以大大简化代码的操作&#xff0c;比如有关HashMap的操作&#xff1a; HashMap<Integer, String> hashMap new HashMap<>(3); hashMap.put(1, &quo…

java8特性快速对list集合的筛选过滤和计算

java8特性快速对list集合的筛选过滤和计算 一、准备工作 1.创建一个Student对象 package com.shiro.test.java8特性;import java.io.Serializable;/*** 学生的实体类*/ public class Student implements Serializable {private String id;private String username;private In…

Java8特性大全(最新版)

一、序言 Java8 是一个里程碑式的版本&#xff0c;凭借如下新特性&#xff0c;让人对其赞不绝口。 Lambda 表达式给代码构建带来了全新的风格和能力&#xff1b;Steam API 丰富了集合操作&#xff0c;拓展了集合的能力&#xff1b;新日期时间 API 千呼万唤始出来&#xff1b;…