求第 N 个 斐波那契数的多种方法

求第n个斐波那契数 斐波那契数 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后... 阅读详情
AI摘要

本文介绍了斐波那契数列的递归法、迭代法及矩阵乘法优化等算法,并通过具体代码实例展示了不同算法的特点。同时,还探讨了一个进阶问题,即求解Fib(N)modFib(K)。

斐波那契数列 是一个非常美丽、和谐的数列,也是一个黄金分割数列。符合黄金分割比0.618。有人说它起源于一对繁殖力惊人、基因非常优秀的兔子,也有人说远古时期的鹦鹉就知道这个规律。
    斐波那契数列由如下递推关系式定义:
         F(0)=0, F(1)=1, n>1时,F(n)=F(n-1)+F(n-2)

下面简单地分析一下常见的Fibonacci数列求解算法:
一 递归法

int Fibonacci(int n)
{
   if (n <= 0)
       return 0;
   if (n==1 || n==2)
       return 1;
   return Fibonacci(n-1)+Fibonacci(n-2); 
}

递归算法与定义公式十分吻合,容易理解,但计算过程存在大量重复的运算,时间复杂度达到了O(2^n),使用的内存空间也随着函数调用栈的增长而增长。这显然不适于实用的程序。

二 迭代法

int Fibonacci(int n)
{
   if (n <= 0)
       return 0;
   if (n==1 || n==2)
       return 1;
   int numa=1, numb=1, num;
   for (int i=3; i<=n; ++i)
   {
       num = numa + numb;
       numa = numb;
       numb = num;
   }
   return numb;
}

迭代法的时间复杂度为O(n),使用的内存空间也不会动态上涨
三 矩阵乘法优化

分两步推导:
这里写图片描述
这里写图片描述
问题的求解就变成矩阵乘法

求斐波那契数列的解决,而幂的求可用二分法来求。

//Fibonacci矩阵
struct Matrix
{
   long long arr[2][2]; 
};
//基矩阵
Matrix A = 
{
   1, 1,
   1, 0,
};
//单位矩阵
Matrix I = 
{
   1, 0,
   0, 1,
};
//两个矩阵的乘积
Matrix multi(Matrix a, Matrix b)
{
   Matrix ans;
   for (int i=0; i<2; ++i)
   {
       for (int j=0; j<2; ++j)
       {
           ans.arr[i][j] = 0;
           for (int k=0; k<2; ++k)
               ans.arr[i][j] += a.arr[i][k]*b.arr[k][j];
       }
   }
   return ans;
}
//基矩阵的k次方
Matrix power(Matrix m, int k)
{
   Matrix ans = I, tmp=A;
   while (k > 0)
   {
       if (k & 1)
       {
           ans = multi(ans, tmp); 
       }
       k >>= 1;
       tmp = multi(tmp, tmp); 
   }
   return ans;
}

四 进阶问题
        给出N和K,求Fib(N) mod Fib(K),由于结果太大,输出Mod 1000000007的结果 :
1 <= N, K <= 10^18, N<=1000
**分析:**可以看出本题就是直接求,虽然这里的很大,但是比较小啊,只到1000,那么实际上在Fibonacci数列中有很多有用的性质,比如:

这里写图片描述
实际上,这个两个公式的推导过程也比较简单。(两种证明方法:带入公式验证;数学归纳法)
所以,我们可以这样来把原表达式变形,即:
这里写图片描述
那么,我们继续对用同样的方法对F(n-m)递归下去,容易得到:
这里写图片描述
可以看出,到了这一步,我们就把所有的Fibonacci数列的下标减小了,基本可以直接计算了。
这里写图片描述
可以得到:
这里写图片描述

所以到了这里,本题基本就说完了,只需要预处理前1000个Fibonacci数列即可。

#include <iostream>
using namespace std;

const int N = 1005;
const int MOD = 1000000007;
long long arr[N]; 

//Fibonacci矩阵
struct Matrix
{
   long long arr[2][2]; 
};
Matrix A = 
{
   1, 1,
   1, 0,
};
Matrix I = 
{
   1, 0,
   0, 1,
};

Matrix multi(Matrix a, Matrix b)
{
   Matrix ans;
   for (int i=0; i<2; ++i)
   {
       for (int j=0; j<2; ++j)
       {
           ans.arr[i][j] = 0;
           for (int k=0; k<2; ++k)
           { 
               ans.arr[i][j] += (a.arr[i][k]*b.arr[k][j]) % MOD;
               ans.arr[i][j] %= MOD; 
           }
       }
   }
   return ans;
}

Matrix power(Matrix m, int k)
{
   Matrix ans = I, tmp=A;
   while (k > 0)
   {
       if (k & 1)
       {
           ans = multi(ans, tmp); 
       }
       k >>= 1;
       tmp = multi(tmp, tmp); 
   }
   return ans;
}

int main()
{
   long long n, m;
   cin >> n >> m;
   int numa = n/m;
   int numb = n%m;
   //得到前1000个Fibonacci数列
   for (int i=1; i<=N; ++i)
   {
       arr[i] = power(A, i-1).arr[0][0]; 
       cout << arr[i] << ' '; 
   }

   return 0;
}
两种方法计算斐波那契数列第n项 两种方法计算第n项斐波那契数。 阅读详情

相关推荐

输入一个数n,求第n个斐波那契数

方法一:递归法 #include <stdio.h> int fib(int n)//递归的方法 { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } int main() { printf("输入:"); int n; scanf_s("%d", &n); printf("第%...

weixin_43723598的博客 808

递归和非递归分别实现求第n个斐波那契数

【问题描述】:使用递归和非递归的方法分别实现求第n个斐波那契数,那么什么是斐波那契数。斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21,后面的每一个数是前面两个数的和。 【解决方法】: 方法一:递归实现 思路: 递归实现`#include<stdio.h> #include<windows.h> int fabonacci(int n) { if (n ...

qq_38325803的博客 416

C语言:求第N个斐波那契数

斐波那契数: 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?我们不妨拿新出生的一对小兔子分析一下:第一个月小兔子没有繁殖能力,所以还是一对;两个月后,生下一对小兔总数共有两对;三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;……依次类推可以列出下表:经过月数 0 1 2

peter——wang的博客 2790

求斐波那契数列的第n项

提要本文介绍了4种(3种?)求斐波那契数列第n项的方法。

George__Yu的博客 9364

线性代数 --- 计算斐波那契数列第n项的快速算法(矩阵的n次幂)

斐波那契数列的是一个古老而又经典的数学数列,距今已经有800多年了。关于斐波那契数列的计算方法几乎是总所周知的,只是当我们希望快速求出其数列中的第100,乃至第1000项时,能不能有又准又快的方法,一直是一个值得探讨和研究的问题。笔者这篇文章中,就介绍了一种基于线性代数的快速算法,即,基于矩阵的n次幂找到斐波那契数列的第n项。

松下J27录放机 1865

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6004

用x种方式求第n项斐波那契数,99%的人只会第一种

斐波那契数列及其求法,动态规划,数组的巧妙使用--滚动数组

IT学长 3567

STM32 IAP+APP合并Hex文件全自动脚本(Keil5一键生成)

本文详细介绍了一种基于Keil5开发环境的STM32 IAP与APP程序Hex文件全自动合并方案。通过编写批处理或Python脚本,并将其集成到Keil的编译后流程中,实现一键编译、自动合并,彻底解决手动操作繁琐易错的问题,极大提升STM32固件开发与远程升级的效率。

weixin_29191761的博客 305

【C语言】求第n个斐波那契数

输入n,输出第n个斐波那契数例如:输入:5 输出:5输入:10, 输出:55输入:2, 输出:1斐波那契数列(Fibonacci sequence),又称黄金分割数列 ,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在学习数学的过程中我们一定遇到过斐波那契数列,但是现在如何用C语言来解决这个问题呢?这里我将给出递归与迭代两种方法尝试。

Octopus2077的博客 1969

【深度避坑】Word 提示“内存或磁盘空间不足,保存失败”的真正原因与终极解决方案

这是 Word 2003 时代的老功能⚠现代 Office 使用全新的保存 API(与 OneDrive 深度集成)老插件无法兼容现代保存机制会拦截 Word 的写入流程导致保存动作失败,Word 误以为磁盘坏了,于是报错不是磁盘坏了,是 Word 被插件绊倒了。Word 无法保存 = 加载项冲突(尤其是书法 / 稿纸向导)。永久禁用即可彻底恢复。如果在写毕业论文、要交文档,强烈建议马上检查一下你的加载项,避免后期出现大规模崩溃丢稿。

m0_59029415的博客 3064

从零部署奥比中光Gemini335L:Python SDK编译与手眼标定环境实战

本文提供了一份从零部署奥比中光Gemini 335L深度相机的完整实战指南。详细介绍了驱动安装、Python SDK编译、CMake配置及虚拟环境搭建等关键步骤,并重点解析了如何通过编译生成Python模块,最终实现深度图与点云数据获取,为后续的机械臂手眼标定工作奠定坚实基础。

weixin_29031161的博客 398

三种方法求第n个斐波那契数:递归,数组,循环

三种方法求第n个斐波那契数:递归,数组,循环

qq_74318921的博客 5476

要理解成本中心与利润中心的根本区别与适用场景,需从 “责任范围、考核核心、管理目标” 三个核心维度切入,同时明确二者在企业管理体系中的联动关系

摘要: 成本中心与利润核心区别在于责任范围、考核目标和管理权限。成本中心仅对成本负责(如生产、行政部门),考核成本控制能力;利润中心需同时管控成本与收入(如独立产品线、区域分公司),以利润为核心指标。选择标准取决于单元是否拥有收入决策权:无收入权的支持/执行部门设为成本中心,能独立经营、核算盈亏的单元设为利润中心。二者协同运作,成本中心为利润中心提供基础支持,利润中心的需求动态影响成本中心资源配置,共同实现企业整体目标。划分本质是确保考核指标与责任范围匹配,避免管理失效。

金牌架构师 656

【C语言入门】递归——求第n个斐波那契数

问题描述: 递归实现求第n个斐波那契数 例如: 输入:5 输出:5 输入:10, 输出:55 输入:2, 输出:1 #include <stdio.h > int fib(int n) { if(n>2) { return fib(n-1)+fib(n-2); } else return 1; } int main() { int n=0; scanf("%d",&n); int ret = fib(n); printf("%d ",ret);

qq_44357963的博客 1537

51单片机8×8LED点阵屏动态显示取模汉字+ Proteus仿真

51单片机8×8LED点阵屏动态显示取模汉字+ Proteus仿真 Proteus仿真 取模软件:pctolcd2002 程序代码 #include<reg52.h> unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//行选 unsigned char code tabb[]={0x08,0x49,0x49,0x7F,0x08,0x49,0x49,0x7F};//选列"出" unsigned cha

perseverance51博客 8055

1 硬件工程师笔面试高频知识考点真题及解析——电阻

本文系统介绍了电阻的基础知识、选型要点及各类特殊电阻的应用。主要内容包括:1. 电阻选型需考虑阻值、封装、功率、精度、耐压等参数;2. 高频信号优先选用小封装电阻以减小寄生参数;3. 采样电阻需高精度、低温漂以保证测量准确性;4. 详细解析了上拉/下拉电阻、0欧电阻、磁珠等元件的特性与区别;5. 介绍了压敏电阻、热敏电阻等特殊电阻的工作原理及应用场景;6. 阐述了阻抗匹配的重要性及常见匹配方法。文章为电子工程师提供了全面的电阻选型与应用指南。

XU157303764的博客 2839

求第n个斐波那契数的几种方法(python)

这种方法利用了矩阵快速幂算法来计算斐波那契数列,比起前两种方法在处理大规模数据时具有更高的性能表现,但代码量较大。以上是几种基于 Python 的求解第 n 个斐波那契数的方法,其中第二种方法是最常用的实现方式。这种方法利用了循环来避免了递归带来的性能问题,具有较好的性能表现。这种方法简单易懂,但时间复杂度是指数级别的,不适用于大规模计算。1.使用递归函数计算第n个斐波那契数。3.使用矩阵乘法计算第n个斐波那契数。2.使用循环计算第n个斐波那契数。

专注后端开发 8169

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

fibonacci斐波那契数列详解 递归求Fn非递归求Fn求n最近的斐波那契数

斐波那契fibonacci 斐波那契额数列即前两项F(0)和F(1)都是1,之后的每一项都是前两项相加和即F(3)=2,F(4)=3,F(5)=5; 通项公式:F(n+2)=F(n+1)+F(n)。 1.递归求fn 给出一个n 求斐波那契数列的Fn 递归解法即写一个递归函数,注意两个点 1: 递归边界条件(n=0或者n=1) 2:递归式 F(n+2)=F(n+1)+F(n) 代码: #include<cstdio> int F(int n) { if(n==0||n==1) return 1;

蔡尼玛的博客 2341

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

输出第N个斐波那契数

斐波那契数 什么是斐波那契数? 斐波那契数列(Fibonacci sequence),又称黄金分割数列。斐波那契数列的排列是:1,1,2,3,5,8,13,21,34,55,89,144…   依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。例如:2是第3个斐波那契数。 实现方法 非递归方法 #define _CRT_SECURE_NO_WARNING...

weixin_45397953的博客 2534

Java:使用递归方法求第n个斐波那契数

斐波那契数列的第一个项和第二项都是1,所以在n=1或者n=2的情况下直接返回1。 n不等于1或2时,第n项斐波那契数列等于n-1项与n-2项的和,使用递归的方法。 代码如下: import java.util.Scanner; public class TestDemo { public static int fib(int n) { if(n==1||n==2) ...

yufy0528的博客 4768

递归和非递归分别实现求第n个斐波那契数。

斐波那契数 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之...

weixin_44840572的博客 903

求第n个斐波那契数 递归和迭代两种方法

求第n个斐波那契数,在本篇博客中讲两种方法:一是利用递归调用函数实现,另一种是利用循环求出第n个斐波那契数。        首先要了解什么是斐波那契数列,斐波那契数列的特征是前两个数是1,其后数位前两个数之和,如 1   1   2   3   5   8.... 下面给出利用递归调用实现,程序代码如下: #include int fib(int n) //函数实现返回斐波那契数值 {

ValDC_Morning的博客 2182
上一篇: 模拟实现多种函数(strlen,strcpy,strcat,strstr,strcmp,memcpy,memmove)
下一篇: 大小端概念以及如何判断当前机器的字节序
dreamispossible
博客等级 码龄9年 265粉丝 110原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值