递归及递归的简单运用之4种方法解斐波那契数列

2023-11-06

什么是递归?
若一个对象部分的包含自己或用它自己给自己定义,那么我们说这个对象是递归的;若一个过程直接或间接的调用自己,那么这个过程是递归的。
递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题,因此可以让我们思考的方式更加简单,程序也更加简练。不过就递归函数而言递归增加了压栈开销,因此空间复杂度比较高。
递归条件:
(1)、减小问题规模,并使子问题与原问题有相同解法。
(2)、设置出口,如果没有出口那么程序会一直递归下去。
递归的简单运用
斐波那契数列是递归问题中非常典型的一个了,我们常用循环的方式解斐波那契数列,循环解法:

long Fibonacci2(size_t N)         //时间复杂度O(n),空间复杂度O(1)
{
    long first = 1;
    long second = 1;
    long sum = 0;
    if (N < 3)
        return 1;
    else
    {
        for (size_t i = 3; i <= N; i++)
        {
            sum = first + second;
            first = second;
            second = sum;
        }
        return sum;
    }
}

这种解法是比较高效的一种解法。
现在来看递归解法:

long Fibonacci1(size_t N)        //时间复杂度O(2^N),空间复杂度O(n)
{
    if (N < 3)
        return 1;
    else
        return Fibonacci1(N - 1) + Fibonacci1(N - 2);
}

这种解法思维方式非常简单,但是时间复杂度特别高,一般不建议采用这种方法。
我们来看一种比较高效的递归解法:

long Fibonacci3(long first, long second, size_t N)  //时间复杂度O(n),空间复杂度O(1)
{
    if (N < 3)
        return second;
    else
        return Fibonacci3(second, first + second, N - 1);
}

如果说前一种递归解法是由后向前计算,那么这种解法就是由前向后计算了,这种递归方式属于尾递归,因此在进行递归时函数只会使用第一次压栈所开辟的栈空间,在一个栈空间内循环,而不会开辟别的栈空间,所以这种方式时间复杂度为O(N),空间复杂度为O(1),是一种非常高效的递归方式。
除此之外还有一种递归解法:

long *Fibonacci4(size_t N)             //时间复杂度O(n),空间复杂度O(n)
{
    long *array = new long[N + 1];
    if (N == 0)
        return NULL;
    array[0] = 0;
    array[1] = 1;
    for (size_t i = 2; i <= N; i++)
    {
        array[i] = array[i - 1] + array[i - 2];
    }
    return array;
}

这种递归解法并不比上一种方式高效,之所以写出来是因为这种递归方式是在一个代码块内递归,而不是上面那种函数的递归。
斐波那契数列解法非常多,在此仅给出4种解法。希望各位大神斧正。

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

递归及递归的简单运用之4种方法解斐波那契数列 的相关文章

  • 大厂领导为什么喜欢跨层与下属聊天

    作为一个在大厂里面浸淫十几年的loser 平时主要精力没用在技术提升上 对于大厂的人情世故各类八卦倒是研究的透彻 如果你细心观察 会发现一些大的公司里面 领导喜欢跨层与下属去沟通聊天 我待过几家比较大的公司 这个现象还是比较普遍 今天就摆一
  • 基于物联网的视觉暂留风扇设计

    论文下载 知网链接 版权所有 有相关问题或索要完整代码实现请联系作者gzn00417或邮箱gzn00417 foxmail com 基于物联网的视觉暂留风扇设计 郭茁宁1 林亦宁2 何胜阳2 哈尔滨工业大学计算机科学与技术学院 黑龙江 哈尔

随机推荐

  • I - LCM of GCDs(约数)

    I LCM of GCDshttps vjudge csgrandeur cn problem AtCoder arc124 c思路 枚举其a 1 和b 1 所有因数 就是将其归类到红蓝两个袋子里去 然后依次判断一对 a i b i 中是否
  • 关于响度、响度级、声强、声强级、声压、声压级、分贝、方、电平、增益、音高、音分

    在录音声学里 响度 响度级 声强 声强级 声压 声压级 分贝 方 电平 增益 音高 音分总是令人头疼的若干概念 这里简单的说一下他们的意义和区别 让我们把它们的顺序整理一下 分贝 分贝是声级测量中最常用的单位 被简写为dB 其中小写的d代表
  • 牛客网-坐标移动

    题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字 两位以内
  • Android性能篇之(八)Android内存溢出/泄漏常见案例分析及优化方案最佳实践总结

    内存溢出是Android开发中一个老大难的问题 相关的知识点比较繁杂 绝大部分的开发者都零零星星知道一些 但难以全面 本篇文档会尽量从广度和深度两个方面进行整理 帮助大家梳理这方面的知识点 基于Java 一 Java内存的分配 这里先了解一
  • Camera.ScreenToWorldPoint方法介绍

    Camera ScreenToWorldPoint方法介绍 Camera ScreenToWorldPoint是Unity中的一个方法 用于将屏幕坐标系中的点转换为世界坐标系中的点 这个方法通常用于将鼠标点击的位置 屏幕坐标系 转换为游戏世
  • 使用WPS Office模糊处理图片-可用作浏览器背景

    前文转到 给浏览器设置一个图片背景 主题 使用WPS Office模糊处理图片 可用作浏览器背景 步骤如下 1 打开WPS Office 新建一个空白PPT 或者右键 新建 PPT演示文稿 2 将你的图片插入到空白页上 点击 插入 形状 矩
  • xssgame第六关至第八关

    第六关 先试试a标签 可以看到 a标签这里被转义了 再试试其他标签 nm use ver alert 1 转换大小写 成功过关 第七关 可以看到 过滤掉了script 于是采取重复嵌套的方式 第八关 首先 测试script 发现点击添加友情
  • Password Validation using regular expressions(JavaScript)

    Including digit check uppercase check lowercase check the length of password check blank check
  • CentOS7常用工具包安装

    CentOS7常用工具包安装 环境 CentOS 7 9 工具 Xshell7 1 wget下载工具 yum y install wget 2 gcc nginx之类由c语言开发的 编译的时候需要用到 yum y install gcc g
  • 求n的阶乘的方法

    n 1 2 3 4 n 具体来说1 2后再乘3再乘4 依次下去 1 首先用循环的方式 include
  • Linux下备份文件到其他服务器

    最近遇到需求 需要定时将文件备份到其他服务器 于是记录一下 本文旨在描述如何通过rsync插件实现服务器之间的文件备份 以下统一将备份文件所在服务器称为 源服务器 接收备份文件的服务器为 目标服务器 目录 一 为什么用rsync 二 安装r
  • 51单片机学习:外部中断0实验

    实验名称 外部中断0实验 接线说明 实验现象 下载程序后 当按下K3键可控制D1指示灯亮灭 注意事项 将红外接收传感器取下 防止对P3 2口干扰 include reg52 h typedef unsigned int u16 对系统默认数
  • JS中如何跳出.forEach循环

    写在前面 提到在一段程序中如果碰到需要终止 结束一个循环 函数或者一段代码 一般会想到以下这几个关键字return continue break 简述一下三者的区别 break 终止整个循环 有内层循环时终止的是内层循环 退出switch语
  • cpu运行gpu上的pytorch 报错:AssertionError:torch not compiled with cuda enabled——已解决

    感觉今天介绍的这种方法可以解决所有这种报错出现的问题 事件发生 报错 AssertionError torch not compiled with cuda enabled 解决方法 后来看到这个代码 parser add argument
  • uniapp:组件间传值

    组件间传值的情况 子组件 父组件 父组件 子组件 普通组件 普通组件 1 父组件 子组件 father vue
  • 深度了解特征工程

    一 特征工程介绍 Feature Engineering 什么是特征工程 特征工程解决了什么问题 为什么特征工程对机器学习很重要 怎么做特征工程 怎么做好特征工程 集众多博友智慧 一文全面了解并应用特征工程 1 定义及意义 1 定义 特征工
  • icmp隧道工具之ptunnel使用

    一 ptunnel 攻击机A 192 168 137 135 安装ptunnel 跳板机B 192 168 137 130 安装ptunnel 靶机 C 192 168 137 133 1 安装支持库 yum install libpcap
  • DSP定点数的计算规则和示例

    目录 1 Q S表示法的数值范围 2 定点化加减法计算规则 2 1 防溢出处理 3 定点化乘法计算规则 3 1 推算 4 定点化除法计算规则 4 1 推算 5 程序代码中如何确定Q值 6 浮点转定点计算示例 1 Q S表示法的数值范围 Q表
  • 网易游戏测试开发,2023届秋招面经

    一面 技术面 40min 三个面试官 一个负责记录 另两个负责问问题 常规问题 自我介绍 询问简历上的项目经验 项目中遇到的难点是什么 简单介绍一下之前笔试题目的算法思想 谈谈这个题目 基础问题 1 数据结构 怎样打印出全排列 2 数据结构
  • 递归及递归的简单运用之4种方法解斐波那契数列

    什么是递归 若一个对象部分的包含自己或用它自己给自己定义 那么我们说这个对象是递归的 若一个过程直接或间接的调用自己 那么这个过程是递归的 递归的思想是把问题分解为规模更小具有与原问题相同解法的子问题 因此可以让我们思考的方式更加简单 程序