求解斐波那切数列的几种算法

article/2025/8/30 1:28:56

斐波那切数列我们并不陌生。在百度百科中我们可以找到有关它的定义:斐波纳契数列(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*)。

斐波那切数列的通项公式为:


我们甚至可以找到它的几个应用:

1.有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
解决:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种登法……
1,2,3,5,8,13……所以,登上十级,有89种走法。

2.一枚均匀的硬币掷10次,问不连续出现正面的可能情形有多少种?

解决:掷一次有2种情况,掷二次有3种情况,掷三次有5种情况...掷10次有144种情况。

3.当n趋于无穷大时,F(n)/F(n+1)的极限是多少?  

解决:这个可由它的通项公式直接得到,极限是(-1+√5)/2,这个就是黄金分割的数值,也是代表大自然的和谐的一个数字。

接下来我们来探讨一下斐波那切数列的一些解决算法:

1.递归算法(是最普遍的解决算法)

int fib(int n)
{if(n<=1){return n;}else{return fib(n-1) + fib(n-2);}}

这种算法的时间复杂度很高。因为在计算fib(n-1)的时候,把fib(n-2)也给计算了一遍。这样资源得不到重复利用。时间复杂度是指数级的。

2.非递归算法(迭代法)

int fib(int n)
{int a=0;int b=1;int c;for(int i=2;i<=n;i++){c = a + b;a = b;b = c;}return c;}

这个算法实际上是根据概念走的。比较简单。另外如果想要提高效率,其实可以将三个变量变为两个变量来做:

int fib(int n)
{int a=0;int b=1;for(int i=2;i<=n;i++){b = a + b;a = b-a;}return b;}


3.矩阵运算:

矩阵运算是能使算法的时间复杂度达到O(logn)的算法,其主要的思路如下:


现在我们主要要知道如何求:。我们可以采用分治法,具体来讲是二分法来解决这个问题:


这样我们容易写出代码:

//定义2×2矩阵;
struct Matrix2by2
{//数据成员int m00;int m01;int m10;int m11;//构造函数Matrix2by2(int m_00,int m_01,int m_10,int  m_11){m00 = m_00;m01 = m_01;m10 = m_10;m11 = m_11;}};//定义2×2矩阵的乘法运算
Matrix2by2 MatrixMultiply(const Matrix2by2& matrix1,const Matrix2by2& matrix2)
{Matrix2by2 matrix12(1,1,1,0);matrix12.m00 = matrix1.m00 * matrix2.m00 + matrix1.m01 * matrix2.m10;matrix12.m01 = matrix1.m00 * matrix2.m01 + matrix1.m01 * matrix2.m11;matrix12.m10 = matrix1.m10 * matrix2.m00 + matrix1.m11 * matrix2.m10;matrix12.m11 = matrix1.m10 * matrix2.m01 + matrix1.m11 * matrix2.m11;return matrix12;}//定义2×2矩阵的幂运算
Matrix2by2 MatrixPower(unsigned int n)
{Matrix2by2 matrix(1,1,1,0);if (n == 1){matrix = Matrix2by2(1,1,1,0);}else if (n % 2 == 0){matrix = MatrixPower(n / 2);matrix = MatrixMultiply(matrix, matrix);}else if (n % 2 == 1){matrix = MatrixPower((n-1) / 2);matrix = MatrixMultiply(matrix, matrix);matrix = MatrixMultiply(matrix, Matrix2by2(1,1,1,0));}return matrix;
}
//计算Fibnacci的第n项
int fib(unsigned int n)
{if (n == 0)return 0;if (n == 1)return 1;Matrix2by2 fibMatrix = MatrixPower(n-1);return fibMatrix.m00;}

4.公式法:


根据这个公式就可以求出第N项,具体代码就不给出了。

5.表驱动的递归法:

这个方法其实是利用递归法的缺点加以改进,在已经计算过的f(n),就不必重复计算了。

#define MAX_LOG 20
int Logs[MAX_LOG] = {0};
int fib(int n)
{if (n <= 1) {return n;} else if (n < MAX_LOG && Logs[n] != 0) {return Logs[n];} else {Logs[n] = fib(n - 1) + fib(n - 2);return Logs[n];}
}

但是在N很大的情况下,不太适用。

6.变形的递归程序。。其实就是迭代法的变形,只不过将while循环或者是for循环的部分变成了递归而已。

int fib_2(int n ,int a ,int b,int count)
{if(count == n) return b;return fib(n,b,a+b,++count);
}
int fib(int n)
{return fib_2(n,0,1,1);
}





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

相关文章

Python多种方法生成菲波那切数列

文章目录 一、顺序输出二、利用递归函数实现三、循环四、利用列表实现五、利用reduce实现六、利用生成器实现七、利用魔术方法实现 记录多种方法生成菲波那切数列 一、顺序输出 代码如下&#xff1a; # 第一种方法 顺序输出# 获取用户输入数据 num int(input("你需要几项…

斐波那契数列详解

目录 1.认识斐波那契数列 1.1 什么是斐波那契数列 1.2 斐波那契数列的规律 2.用代码的思维实现斐波那契数列 2.1 确定要查找第几个斐波那契数列 2.2 如何利用斐波那契数列规律 2.3 如何利用循环实现斐波那契数列 2.4 如何进入循环 2.5 如何跳出循环 1.认识斐波那契数列 …

求斐波那契数列的三种方法

什么是斐波那契数列&#xff0c;1,1,2,3,5,8,13...这样一个数列就是斐波那契数列&#xff0c;求第n项的值。 一、经典求法 观察数列可得&#xff0c;除了第一项和第二项&#xff0c;所有的数列的值都是前一项和前一项的前一项的加和&#xff0c;转换成函数也就是f(n) f(n-1)…

斐波那契数列

斐波那契数列来源于兔子繁殖问题&#xff0c;所以也叫兔子序列。   最开始我一直不能理解兔子问题怎么和斐波那契数列联系在一起的&#xff0c;然后画了这个图之后&#xff0c;就明白了。   第一年有一对小兔子&#xff0c;一年后成年。成年的兔子又可以生出一对小兔子&…

深入浅出总结求解菲波那切数列的五种方法

文章目录 题目思路一: 递归思路二: 递归 剪枝 (递归的优化)思路三: 动态规划思路四: 迭代 (动态规划的优化)思路五: 矩阵运算 快速幂 题目 菲波那切数列 定义 a0 0, a1 1, a2 1, an an − 1 an − 2, 求 an 是多少? 思路一: 递归 由于每一项都遵循这个公式: an an −…

图解寻址方式

注: 学习自 唐朔飞《计算机组成原理》 图自 唐朔飞《计算机组成原理》PPT整合 寻址方式 一丶指令寻址 二丶数据寻址 堆栈寻址

寻址方式一

目录 立即数、寄存器、存储器的概念 数据寻址方式 立即寻址&#xff1a; 寄存器寻址&#xff1a; 存储器寻址: 注意&#xff1a; 立即数、寄存器、存储器的概念 立即数&#xff1a;参与操作的数据本身&#xff0c;8位或16位 &#xff08;只能作为src,无法成为dst&#xf…

计算机寻址方式

一、指令寻址 1.两种方式 顺序寻址 每次寻址后 PC自动 1 &#xff1b; 跳跃寻址 当跳转到 JUP 指令时 其后的为立即数指令 &#xff0c;便跳转到对应的指令数。 数据寻址 立即寻址特征 地址村的为立即数特征 直接寻址特征 形式地址为&#xff1a; 操作数的真实地址 隐含寻…

指令格式与寻址方式

指令与指令系统 指令: 控制计算机完成某种操作的命令。 指令系统&#xff1a; 处理器所能识别的所有指令的集合。 指令的兼容性&#xff1a; 同一系列机的指令都是兼容的。 汇编语言&#xff1a; 指令助记符。 指令格式 例如&#xff1a; 寻址方式 操作数可能的来源或…

寻址方式介绍

根据指令内容确定操作数地址的过程称为寻址。完善的寻址方式可为用户组织和使用数据提供方便。 ①直接寻址&#xff1a;指令地址域中表示的是操作数地址。 ②间接寻址&#xff1a;指令地址域中表示的是操作数地址的地址即指令地址码对应的存储单元所给出的是地址A&#xff0c…

8086寻址方式

8086寻址方式 寻址方式总共有两大类: 按数据寻址 按地址寻址 1.数据寻址方式 MOV DST,SRC和数据有关的寻址方式 1.立即寻址: 操作数直接在源操作数中给出 MOV AL,45H 源操作数在指令中给出,立即数只能是源操作数 立即数的长度和DST长度一致 2.寄存器寻址 操作数放在指定的寄存…

数据寻址方式

以下例子中的寻址方式说的都是源操作数&#xff0c;因为目的操作数都用的是寄存器寻址&#xff0c;不再讨论 1.立即寻址 立即寻址是指令直接给出立即数本身作为操作数&#xff0c;立即数作为指令的一部分跟指令一起存在于代码段中&#xff0c;会被指令预取队列直接取到CPU中进…

IPv6 寻址方式简介

在计算机网络中&#xff0c;寻址模式是指在网络上托管地址的机制。IPv6 提供了多种类型的模式&#xff0c;可以通过这些模式对单个主机进行寻址。也可以同时对多个主机进行寻址或者寻址最近距离的主机。 单播寻址 在单播寻址方式中&#xff0c;IPv6 接口&#xff08;主机&…

七种寻址方式(立即寻址、寄存器寻址)

七种寻址方式(立即寻址、寄存器寻址) 一、立即寻址方式 操作数作为指令的一部分而直接写在指令中&#xff0c;这种操作数称为立即数&#xff0c;这种寻址方式也就称为立即数寻址方式。 立即数可以是8位、16位或32位&#xff0c;该数值紧跟在操作码之后。如果立即数为16位或32位…

8086寻址方式图解

目录 1&#xff1a;立即寻址 2&#xff1a;寄存器寻址 3&#xff1a;直接寻址&#xff08;存储器直接寻址&#xff09; 4&#xff1a;寄存器间接寻址&#xff08;重点&#xff09; 5&#xff1a;基址寻址&#xff08;相对寻址&#xff09; 6&#xff1a;变址寻址 &#x…

七种寻址方式

七种寻址方式&#xff08;从该处学习转载&#xff0c;感谢&#xff0c;如有侵犯&#xff0c;请联系删除&#xff09; 立即寻址 操作数作为指令的一部分而直接写在指令中&#xff0c;这种操作数称为立即数&#xff0c;这种寻址方式也就称为立即数寻址方式。 立即数寻址方式通…

十种寻址方式

寻址方式 寻址方式分为指令寻址和数据寻址。 目录 寻址方式 一、指令寻址 二、数据寻址 1.立即寻址 2.直接寻址 3.隐含寻址 4.间接寻址 5.寄存器&#xff08;直接&#xff09;寻址 6.寄存器间接寻址 7.基址寻址 8.变址寻址 9、相对寻址 10、堆栈寻址 一、指令寻…

常用的图像特征提取方法

1. 灰度特征可提取&#xff1a;灰度平均值、方差 2.纹理特征提取 MATLAB程序&#xff1a; %%%特征提取 clear all; close all; clc;Ddir(E:\my_work\长光所\云图\数据集\云样本\*.jpg); cloud_featurezeros(length(D),5);for i1:length(D)imgimread([E:\my_work\长光所\云图\…

OpenCV图像特征提取

Camera系列文章 传感器融合是将多个传感器采集的数据进行融合处理&#xff0c;以更好感知周围环境&#xff1b;这里首先介绍Camera的相关内容&#xff0c;包括摄像头及图像知识基本介绍&#xff0c;OpenCV图像识别&#xff08;特征提取&#xff0c;目标分类等&#xff09;&…

(八)特征选择与特征提取

特征选择与特征提取 一、特征的选择 1、原始特征 在描述对象的时候 模式识别中把每个对象都量化为一组特征来描述&#xff0c;构建特征空间是解决模式识别问题的第一步&#xff0c;其中通过直接测量得到的特征称为原始特征。 如&#xff1a; - 人体的各种生理指标&#xff0…