斐波那契数列递归思路

2023-10-30

斐波那契数列是一个十分特殊的数列,与排列组合等都有密切的联系,最后的比值更是精妙的黄金比例。

斐波那契数列F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2).
那么我们可以直接用递推公式写出简单的递归思路:
F(n)=F(n-1)+F(n-2)

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

但显然这样的递归是可怕,每一次递归就会调用两次自身直到n=0或n=1,呈现出指数增长,很多情况下难以满足我们的要求

所以我们可以换一个思路。
观察斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55……当我们去掉首项1时,剩下的子数列1, 2, 3, 5, 8, 13, 21, 34, 55……依然满足递推公式,而数列的长度得到了缩短,变成了n-1。所以我们所求的第n项斐波那契数列,变为了子数列中第n-1项,实现了缩小规模与调用自身的特点,可以使用递归实现。

int recur_fibo(int n,int first=0,int second=1)
{
	if (n < 2)return n;
	if (n==2)return first+second;
	else return recur_fibo(n - 1, second, first + second);
}

这样的递归,被称为尾递归,其复杂度不过是线性程度,计算完全可以胜任这样的计算(在允许的时间内)。思路是缩短数列的长度,而非去求每一项的值。这样的思路实际上已经有了动态规划的味道在里面,即状态转移方程的应用。

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

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

  • linux下的串口调试工具安装及使用

    两行命令安装串口调试助手 如下 sudo apt get install cutecom sudo cutecom
  • 基础的复位电路

    目前在系统化的学习电路知识 因此将一些值得记忆的内容记录下来 方便查阅 单片机必须要设计一个复位电路 以防指针跑飞或是出现其他状况 由于系统初始化时 也需要一个过程 此时希望程序处于复位的状态 防止单片机误发命令 因此常用上图所示电路 以下
  • Hexo+Github博客搭建教程(个人操作过程)

    Hexo Github博客搭建教程 个人操作过程 最近自己尝试利用hexo github搭建了blog 来记录一下过程 一 准备环境 1 node环境 首先 安装 nodejs 因为Hexo是基于 Node js 驱动的一款博客框架 htt
  • MATLAB中fillmissing函数用法

    目录 语法 说明 示例 包含 NaN 值的向量 由 NaN 值组成的矩阵 插入缺失数据 使用移动中位数方法 使用自定义填充方法 包含缺失端点的矩阵 包含多个数据类型的表 fillmissing函数的功能是填充缺失的条目 语法 F fillm
  • 【Educoder作业】冯·诺依曼体系结构及工作原理理解

    Educoder作业 冯 诺依曼体系结构及工作原理理解 所有的那个实际场景模拟的题就不更了 没难度 趣味性更高 这个题和我们之前的一篇博客里面的题只一模一样的 链接 我们这里就不做任何讲解了 要说的那一篇里已经说过了 几天过去 有些程序的实

随机推荐

  • STM32F1软件仿真

    MDK 的一个强大的功能就是提供软件仿真 通过软件仿真 我们可以发现很多将要出现 的问题 避免了下载到 STM32 里面来查这些错误 这样最大的好处是能很方便的检查程序存 在的问题 因为在 MDK 的仿真下面 你可以查看很多硬件相关的寄存器
  • 1.Kubernetes(K8S)架构1(Master,Node和Pod)

    简介 K8S是当前主流的容器编排系统 服务编排系统要想实现服务的自动化部署和运行离不开容器编排系统 容器目的是解决服务器的异构问题 解决了部署的时候无需在考虑底层系统环境是否能够满足服务的需要 但是单独的容器并没有生产的价值 因为他只是提供
  • Jupyter Notebook的使用01—三种打开方式以及修改默认打开文件夹

    首先安装Anaconda 成功后 打开开始菜单会出现下图所示 方法一 1 点击 Anaconda Prompt 2 输入jupyter notebook 方式二 直接点击 Jupyter Notebook 也可以 创建桌面快捷方式 以后就可
  • js工具类合集(utils.js)

    目录 1 验证URL格式 2 获取当前日期或时间type date 获取日期 time 获取时间 3 日期 时间选择框转换字符串 4 格式化时间 5 随机生成32位数 6 前端分页展示数据 7 判断日期是不是今天 昨天 明天 8 坐标转化
  • GridControl 列合并(自定义分组条件)

    说明 当前方式不提倡 最好还是使用 1 主从表 或 2 分组 一 数据源 DataTable dta new DataTable dta Columns Add A dta Columns Add B dta Columns Add C d
  • Zookeeper伸缩性,Observer

    https blog csdn net gangsijay888 article details 82426540
  • C# 中分享重试控制

    1 首先 我想标准化处理 因为存在重试的情况 例如数据库相关处理 方法有返回值 所以我想两者都支持 我希望能够设置重试次数和重试间隔 public class RetryExecteUtil public static T Execute
  • ElasticSearch版本控制--java实现

    一 前言 最近工作中有这样一个ElasticSearch 以下简称ES 写入的场景 Flink处理完数据实时写入ES 现在需要将一批历史数据通过Flink加载到到ES 有两个点需要保证 对于历史数据 ES已有文档 则舍弃旧数据 ES没有则插
  • Unity 5 中的全局光照技术详解

    全局光照 简称GI 是一个用来模拟光的互动和反弹等复杂行为的算法 要精确的仿真全局光照非常有挑战性 付出的代价也高 正因为如此 现代游戏会先一定程度的预先处理这些计算 而非游戏执行时实时运算 同一场景里 没有照明 左 只有直接光源 中 和有
  • mapreduce编程实验报告

    MapReduce分布式计算系统 1 HDFS 分布式存储系统 2 MapReduce 分布式计算系统 3 YARN hadoop 的资源调度系统 Common 以上三大组件的底层支撑组件 提供基础工具包和 RPC 框架等 Map处理 pu
  • 算法篇-面试必刷Top2-链表内指定区间反转

    BM2 链表内指定区间反转 解题思路 头插法 在学会了BM1 反转链表之后 要解决这个问题就很简单了 前一题是整个链表反转 这一题是部分反转 这上一题就是这道题的前置问题啊 那我们肯定是要先找到了第m个位置才能开始反转链表 而反转的部分就是
  • 选择排序——堆排序

    一 堆排序的相关概念 1 堆的定义 从堆的定义可以看出 堆实质是满足如下性质的完全二叉树 二叉树中任一非叶子结点均小于 大于 它的孩子结点 2 堆排序的定义 若在输出堆顶的最小值 最大值 后 使得剩余n 1个元素的序列重又建成一个堆 则得到
  • Deep Learning(深度学习)简要介绍

    转载自 https blog csdn net liulina603 article details 44216677 二 背景 机器学习 Machine Learning 是一门专门研究计算机怎样模拟或实现人类的学习行为 以获取新的知识或
  • org.elasticsearch.search.SearchContextMissingException: No search context found for id

    org elasticsearch transport RemoteTransportException datanode63 10 65 209 163 9300 indices data read search phase query
  • 7-7 模拟出拳游戏

    编写程序 模拟石头 剪刀 布的出拳游戏 提示程序输入一个数 这个数为2 1或0 分别表示石头 剪刀和布 提示用户输入值2 1或0 然后显示一条消息 表明用户和计算机谁赢了游戏 输入格式 输入两个范围在0 1 2之间的整数值 中间用空格分隔
  • Ngnix 反向代理服务器 安装方法记录

    一 nginx window下的安装和简单使用 下载地址 http nginx org en download html 将ngnix zip 解压到 E ngnix nginx 1 15 10 进入conf 更改ngnix conf文件
  • 跨平台桌面应用的开发框架——Electron

    一 背景 在团队中 我们因业务发展 需要用到桌面端技术 如离线可用 调用桌面系统能力 什么是桌面端开发 一句话概括就是 以 Windows macOS 和 Linux 为操作系统的软件开发 对此我们做了详细的技术调研 桌面端的开发方式主要有
  • 机器学习中常用的线性回归问题

    一 线性回归的定义及矩阵运算 线性回归的定义是 目标值预期是输入变量的线性组合 线性模型形式简单 易于建模 但却蕴含着机器学习中一些重要的基本思想 线性回归 是利用数理统计中回归分析 来确定两种或两种以上变量间相互依赖的定量关系的一种统计分
  • 【复杂链表的复制】

    目录 前言 一 复杂链表的复制 一 创建并链接拷贝节点 1 题目分析 2 具体代码 二 设置random指针 1 题目分析 2 具体代码 三 分离拷贝链表并恢复原链表 1 题目分析 2 具体代码 二 整体代码 总结 前言 打怪升级 第3天
  • 斐波那契数列递归思路

    斐波那契数列是一个十分特殊的数列 与排列组合等都有密切的联系 最后的比值更是精妙的黄金比例 斐波那契数列F 0 0 F 1 1 F n F n 1 F n 2 那么我们可以直接用递推公式写出简单的递归思路 F n F n 1 F n 2 i