递归求斐波那契数列

2023-11-10

斐波那契数列

         题目描述:编写一个函数,求斐波那契数列的第n项的值。

         首先,对于斐波那契数列,我们是非常熟悉了,对斐波那契定义为如下:f(0)=0,f(1)=0,f(2)=1,……f(n)=f(n-1)+f(n-2),其中n>1。对于这种求斐波那契数列第n项的问题,我们大多采用递归来解决。那什么是递归呢?递归即是在一个函数的内部调用这个函数自身的一种方法。比如斐波那契数列中,我们如果想计算第4项的值,那么就必须计算第3项的值,要计算第3项的值,就要计算第2项的值,依次计算,直到找到函数的出口,即上面所写出的n=0和n=1时的斐波那契数列的值。

         所以,我们要使用递归来解决这道题的话,最简单的也是最容易被大家想到的代码为:

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

         这种代码简单倒是简单,但它并不是解决此题的最好的最优的代码。我们以求解Fib(10)为例,来分解一下代码可知,要想求得Fib(10),需要先求得Fib(9)和Fib(8)。那么要想求得Fib(9),就得先求Fib(8)和Fib(7)……但是我们在求Fib(10)的时候已经求过Fib(8)了啊,由于没有保存所求得的结果,所以导致还得再求一次Fib(8),这样一来,无形中增加了算法的时间复杂度。计算量会随着n的增大而急剧增大。而事实上,用递归方法计算的时间复杂度是以n的指数方式递增的。

         改进:此种方法是因为重复计算太多,导致当n很大时,拖慢程序运行时间,我们只要避免这些重复计算就可以大大减少程序运行时间了。于是,我们决定,从前往后计算,首先根据Fib(0)和Fib(1)计算出Fib(2),之后再根据Fib(1)和Fib(2)计算出Fib(3)……以此类推,计算出Fib(n),此种方法的时间复杂度为O(n)。

代码如下:

long long Fib(unsigned int n)
{
    //存储结果的数组,初始化为0,1,即Fib(0)和Fib(1)
    int res[2] = { 0, 1 };
    if (n <= 1)
    {
        return res[n];
    }
    long long Fib_1 = 1;
    long long Fib_2 = 0;
    long long Fib_n = 0;
    for (unsigned i = 2; i <= n; i++)
    {
        Fib_n = Fib_1 + Fib_2;
        Fib_2 = Fib_1;
        Fib_1 = Fib_n;
    }
    return Fib_n;
}

         常见的与斐波那契数列相关类型的题还有跳台阶问题,即上台阶的基本方法有两种,一是一步跨一个台阶,一是一步跨两个台阶,问跨上一个n阶台阶有多少种方法。此题完全是斐波那契数列求第n项,只是换了个描述而已。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归求斐波那契数列 的相关文章

随机推荐

  • 嵌入式web服务器Boa的移植

    Boa是一种非常小巧的Web服务器 其可执行代码只有大约60KB左右 作为一种单任务Web服务器 Boa只能依次完成用户的请求 而不会fork出新的进程来处理并发连接请求 但Boa支持CGI 能够为CGI程序fork出一个进程来执行 Boa
  • 考研数据结构--第二章:线性表

    系列索引 2023考研王道数据结构知识梳理 文章目录 1 线性表 1 1 线性表定义 1 2 线性表的特点 1 3 线性表的基本操作 2 顺序表 2 1 顺序表的定义 2 2 顺序表的实现 2 2 1 顺序表的静态分配 2 2 1 1 局限
  • Div点击显示再次点击隐藏

    1 先上效果 这是默认显示的时候 这是再点击隐藏的时候 下方代码贴出 有需要的C V直接浏览器查看
  • 【Unity基础】Input.GetAxis()函数

    根据输入设备 参数分为两类 一 触屏类 1 Mouse X 鼠标沿屏幕X移动时触发 2 Mouse Y 鼠标沿屏幕Y移动时触发 3 Mouse ScrollWheel 鼠标滚轮滚动是触发 二 键盘类 1 Vertical 键盘按上或下键时触
  • windows系统下,如何使用win+R快速打开安装的应用

    windows系统下 如何使用win R快速打开安装的应用 随着工作学习时间的增加 我们的桌面就会出现越来越多的文件和应用快捷方式 使得桌面变得很杂乱 有时候需要打开某个应用的时候就可能需要花费时间来找 那我们如何快速打开我们需要的应用呢
  • Layout的放大和缩小效果例子(ScaleAnimation)

    个Layout从中心放大和缩小的例子 直接上代码 1 ScaleDialog java文件 Java代码 package cn com import android app Activity import android graphics
  • TypeError: ‘function‘ object is not subscriptable

    关于错误 TypeError function object is not subscriptable 错误原因 get dummies函数 写成了
  • https网络编程——如何建立利用根证书(凭证)签发建立中继证书(凭证)详解

    参考 如何建立利用根证书 凭证 签发建立中继证书 凭证 详解 地址 https qingmu blog csdn net article details 108221568 spm 1001 2014 3001 5502 目录 在建立中继之
  • oracle 写入 权限设置,改变用户组文件的读写和执行权限

    网上找来一篇关于linux权限修改方式文章 对于我脑子记性不好的人有非常大的帮助 1 更改档案拥有者 命令 chown cfhvR help version user group file 功能 更改文件或者文件夹的拥有者 参数格式 use
  • c++读写文件

    目录 1 写文件 2 读文件 3 二进制方式写文件 4 3 二进制方式读文件 文件类型分为两种 文本文件 文件以文本的ASCII码形式存储在计算机中 二进制文件 文件以文本的二进制形式存储在计算机中 用户一般不能直接读懂它们 操作文件的三大
  • 小型机 PC服务器 性能,pc服务器小型机

    pc服务器小型机 内容精选 换一换 业务测试完成后或不再需要克隆服务器 您可参考本章节删除克隆服务器 删除克隆服务器后 请到弹性云服务器Console界面检查 使用主机迁移服务迁移Windows系统的源端服务器时 要求目的端服务器的磁盘大小
  • 进程间通讯的7种方式

    1 常见的通信方式 管道pipe 管道是一种半双工的通信方式 数据只能单向流动 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 命名管道FIFO 有名管道也是半双工的通信方式 但是它允许无亲缘关系进程间的通信 消息队
  • [架构之路-213]- 架构 - 架构设计过程快速概览与在线画图工具

    目录 第一步 业务系统 1 收集目标系统的用户需求 2 定义用例图 第二步 领域建模 1 业务流程定义 2 业务功能分解 3 非功能性架构 支撑架构 第三步 高层架构设计 1 应用展现层 2 业务功能层 3 框架支撑层 第四部 详解架构设计
  • 如何查gmail发件人ip_如何在Gmail中阻止来自特定发件人的电子邮件

    如何查gmail发件人ip There are some email senders from which you never want to hear You can t stop them from sending you emails
  • 瞳孔特征值提取,blink frequency,fixation frequency,saccad extent, pupil diameter等

    进行的分析有 滤波分析 fft psd database py 下面展示一些 内联代码片 import pandas as pd import numpy as np def read file raw path data pd DataF
  • unity 3d 原创制作射击游戏(一)

    目录 实验一 4 1 设计如下UI界面 其中包含了canvas Panel Text Button Image RawImage等UI元素 4 2 实现点击Play按钮转换场景 点击Exit退出游戏的功能 5 3 主界面添加音量滑动杆 静音
  • Flink1.11.0 SQL与hive整合

    一 前言 此次flink sql 整合 hive 主要是能在flink sql中读写hive数据 为flink实时写数据进入hive 构建实时数仓做准备工作 flink 1 11 0 hive 2 3 4 hadoop 2 7 2 主要步骤
  • 使用Python,OpenCV制作不同风格的素描图(正常,漫画,写实风格)

    使用Python OpenCV制作不同风格的素描图 正常 漫画 写实风格 这篇博客将介绍如何使用Python OpenCV制作不同风格的素描图 正常风格 漫画风格 写实风格 1 效果图 原始图 VS 正常风格素描图 VS 漫画风格素描图 V
  • 软件测试缺陷的定义、产生原因、缺陷报告格式、缺陷报告

    软件缺陷的定义 错误 静态存在于说明文档中的表述或编码错误 缺陷 存在于代码中或硬件系统中的错误 BUG 被测对象实际表现与用户显性需求或隐性需求中的差异 功能实现错误 功能实现遗漏 功能实现多余 功能实现不好 失效 因缺陷激发后导致功能的
  • 递归求斐波那契数列

    斐波那契数列 题目描述 编写一个函数 求斐波那契数列的第n项的值 首先 对于斐波那契数列 我们是非常熟悉了 对斐波那契定义为如下 f 0 0 f 1 0 f 2 1 f n f n 1 f n 2 其中n gt 1 对于这种求斐波那契数列第