返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中实现fibonacci数列的几种方法是哪些呢
  • 789
分享到

C++中实现fibonacci数列的几种方法是哪些呢

2023-06-28 23:06:45 789人浏览 八月长安
摘要

小编今天带大家了解c++中实现fibonacci数列的几种方法是哪些呢,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“C++中实现fi

小编今天带大家了解c++中实现fibonacci数列的几种方法是哪些呢,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“C++中实现fibonacci数列的几种方法是哪些呢”的知识吧。

前言

fibonacci数列的实现主要有三种方法:递归、循环与矩阵。这里主要学习了如何在C++中实现这三种方法以及分析它们各自的时间复杂度。

一、fibonacci数列是什么?

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)

二、递归实现

1.递归的特点

  • 递归:函数自己调用自己

  • 递归的"缺陷":递归到一定程度,会发生"栈溢出"

  • 递归的"时间复杂度":递归总次数*每次递归的次数

  • 递归的"空间复杂度":递归的深度*每次递归空间的大小(注意:"每次递归空间的大小"是个常数,可以基本忽略不计)

  • 递归的"深度":树的高度(递归的过程是一个"二叉树")

2.C++实现

int main(){    int n;    long long sum;          scanf("%d",&n);    sum =fb(n);      printf("%lld\n",sum);        return 0;} long long fb(int n){    if(n<1){        return 0;            }else if(n==1||n==2){        return 1;    }    return (fb(n-1)+fb(n-2));}

时间复杂度

C++中实现fibonacci数列的几种方法是哪些呢

二叉树的高度是 n - 1,一个高度为k的二叉树最多可以有 2^k - 1个叶子节点,也就是递归过程函数调用的次数,所以时间复杂度为 O(2^n),而空间复杂度就是树的高度 O(n)。

三、循环实现

1.C++实现

long long Fib(long long N){    long long first = 1;    long long second = 1;    long long ret = 0;    for (int i = 3; i <=N; ++i)    {        ret = first + second;        first = second;        second = ret;    }    return second;}int main(){    long long num = 0;    num=Fib(10);    printf("循环:%d\n", num);    system("pause");    return 0;}

2.时间复杂度

  • 时间复杂度:O(N)

  • 空间复杂度:O(1)(创建了四个对象,是常数,所以可忽略不计)

四、矩阵实现

1.理论推导

斐波那契数列的递推公式是:f(n)=f(n-1)+f(n-2);

 在线性代数中,类似于斐波那契数列这种递推式称为二阶递推式。我们可以用f(n)=af(n-1)+bf(n-2)将二阶递推式一般化。只要符合这种二阶递推式的算法,都可以将算法的时间复杂度降为O(logN)。当然,三阶,四阶....都可以,只要得到递推公式的n阶矩阵即可。如下:

     f(n)=af(n-1)+bf(n-2)+......

     (f(n),f(n-1))=(f(n-1),f(n-2))*matrix;(matrix是一个矩阵,几阶递推式就是几阶的矩阵,在这里是二阶的矩阵,斐波那契数列属于二阶)

C++中实现fibonacci数列的几种方法是哪些呢&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;①

C++中实现fibonacci数列的几种方法是哪些呢&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;②

C++中实现fibonacci数列的几种方法是哪些呢

于是只要求得C++中实现fibonacci数列的几种方法是哪些呢即可。

而类似求还可以简化(快速幂)

例如:

10^68,我们通常是10*10乘上68次,这样时间效率为O(N),我们要用O(logN)方法算:

     68的二进制序列为:1000100

     10^68=10^64*10^4,也就是取出68二进制序列为1的位,其他忽略。这样我们只算了7次(二进制序列的长度)就可以算出10^68,效率就达到了O(logN)。(最优化算法的关键所在)

所以时间复杂度可以达到最优化O(logN)。

2.C++实现

struct Matrix2By2 {    Matrix2By2(long long m00 = 0, long long m01 = 0, long long m10 = 0,    long long m11 = 0)        :m_00(m00), m_01(m01), m_10(m10), m_11(m11) {}    long long m_00, m_01, m_10, m_11;}; Matrix2By2 MatrixMultiply(const Matrix2By2& matrix1, const Matrix2By2& matrix2) {    return Matrix2By2(  matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10,                        matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11,                        matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10,                        matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11    );} Matrix2By2 MatrixPower(unsigned int n) {    assert(n > 0);    Matrix2By2 matrix;    if (n == 1)        matrix = Matrix2By2(1, 1, 1, 0);    else if (n % 2 == 0) {    // n是偶数        matrix = MatrixPower(n / 2);        matrix = MatrixMultiply(matrix, matrix);    }    else if (n % 2 == 1) {    // n是奇数        matrix = MatrixPower((n - 1) / 2);        matrix = MatrixMultiply(matrix, matrix);        matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));    }    return matrix;} long long Fibonacci_Solution3(unsigned int n) {    if (n <= 1) return n;    Matrix2By2 PowerNMinus2 = MatrixPower(n - 1);    return PowerNMinus2.m_00;}

3.时间复杂度

O(logN)。

感谢大家的阅读,以上就是“C++中实现fibonacci数列的几种方法是哪些呢”的全部内容了,学会的朋友赶紧操作起来吧。相信编程网小编一定会给大家带来更优质的文章。谢谢大家对编程网网站的支持!

--结束END--

本文标题: C++中实现fibonacci数列的几种方法是哪些呢

本文链接: https://lsjlt.com/news/321288.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中实现fibonacci数列的几种方法是哪些呢
    小编今天带大家了解C++中实现fibonacci数列的几种方法是哪些呢,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“C++中实现fi...
    99+
    2023-06-28
  • C++中实现fibonacci数列的几种方法
    目录前言一、fibonacci数列是什么?二、递归实现1.递归的特点2.C++实现三、循环实现1.C++实现2.时间复杂度四、矩阵实现1.理论推导2.C++实现3.时间复杂度前言 f...
    99+
    2024-04-02
  • c++继承的实现方式有哪几种
    在C++中,有三种继承的实现方式:公有继承、私有继承和保护继承。 公有继承: 公有继承是最常用的继承方式。使用关键字"publi...
    99+
    2023-10-26
    c++
  • C#实现加密的几种方法介绍
    1.ACSII码加密 //ACSII码加密 private static string ACSIIPWd(string rpwd) { ...
    99+
    2024-04-02
  • java实现异步的方法有哪几种
    在Java中实现异步的方法有多种方式,其中一些常见的包括: 使用线程池:通过创建一个线程池来处理异步任务,可以使用Executo...
    99+
    2024-04-02
  • c++中的函数调用有哪几种方式
    c++ 函数调用方式有五种:值传递、引用传递、指针传递、返回值、虚函数调用。值传递传递副本,不会影响实际参数;引用传递传递引用,修改参数会影响实际参数;指针传递传递地址,修改参数会影响实...
    99+
    2024-05-01
    c++
  • 【Mysql系列】mysql中删除数据的几种方法
    写在前面  在MySQL数据库中,删除数据是一个常见的操作,它允许从表中移除不再需要的数据。在执行删除操作时,需要谨慎,以免误删重要数据。 方法介绍 以下是MySQL中删除数据的几种方法: DELETE语句DROP T...
    99+
    2023-09-17
    mysql 数据库 原力计划
  • Python数组变形的几种实现方法
    目录1.reshape2.flatten3.ravel4.stack(1)concatenate(2)vstack(3)dstack(4)hstack(5)r,c模式5.split(...
    99+
    2024-04-02
  • C++中strlen函数的三种实现方法
    目录一、strlen函数是什么二、strlen的三种实现方法1、第一种方法(直接)2、第二种方法(递归)3、第三种方法(指针-指针)四、小结一、strlen函数是什么 我们经常用到s...
    99+
    2024-04-02
  • C++单例模式的几种实现方法详解
    目录局部静态变量方式静态成员变量指针方式智能指针方式辅助类智能指针单例模式通用的单例模板类总结局部静态变量方式 //通过静态成员变量实现单例 //懒汉式 class Single2 ...
    99+
    2024-04-02
  • python实现多线程的方法有哪几种
    在Python中,有多种方法可以实现多线程,其中最常用的有以下几种: 使用 threading 模块:Python的 thread...
    99+
    2024-03-08
    python
  • Shell中实现整数自增的几种方法示例
    前言 我们日常使用的Shell脚本中,在用于while或for循环中经常要涉及到整数自增的情况,其实实现自增的方法有很多,下面罗列下可能的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:...
    99+
    2022-06-04
    整数 示例 几种方法
  • Java中字符序列的替换与分解的几种实现方法
    目录一、使用String类二、使用StringTokenizer类三、使用Scanner类四、使用Pattern类与Matcher类一、使用String类 String对象调用pub...
    99+
    2024-04-02
  • 在PHP中实现重定向功能的几种方法,哪种最优?
    在Web开发中,重定向是一项非常重要的功能。重定向可以使用户在不同的URL之间进行跳转,从而实现更好的用户体验和网站性能优化。在PHP中,实现重定向功能有多种方法,但哪种方法最优呢?本文将详细介绍PHP中实现重定向的几种方法,并分析它们的...
    99+
    2023-09-04
    leetcode 重定向 框架
  • 在html中实现列表的方法有哪些
    在html中实现列表的方法有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.无序列表用粗体圆点(典型的小黑圆圈)进行标记。列表始于 <ul> ...
    99+
    2023-06-14
  • 详解Oracle 中实现数据透视表的几种方法
    数据透视表(Pivot Table)是 Excel 中一个非常实用的分析功能,可以用于实现复杂的数据分类汇总和对比分析,是数据分析师和运营人员必备技能之一。今天我们来谈谈如何在 Or...
    99+
    2024-04-02
  • php将json转为数组的方法有哪些几种
    这篇“php将json转为数组的方法有哪些几种”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php将json转为数组的方法有...
    99+
    2023-07-05
  • uniapp中实现换行替换的几种方法
    在进行uniapp开发的时候,我们常常需要对文字的显示做一些特殊的处理。其中一个常见的问题是如何实现换行替换。在这篇文章中,我们将介绍uniapp中实现换行替换的几种方法。使用正则表达式首先,我们可以使用正则表达式来进行换行替换。具体的代码...
    99+
    2023-05-14
  • 几种常见的Python算法实现分别有哪些
    这篇文章将为大家详细讲解有关几种常见的Python算法实现分别有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。选择排序选择排序是一种简单直观的排序算法。它的原理是这样:首先在未排序序列中...
    99+
    2023-06-02
  • 队列实现栈的方法有哪些
    本篇内容介绍了“队列实现栈的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来回顾一下栈(Sta...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作