热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

经典的裴波拉契数列与尾递归实现

对于经典的裴波拉契数列:f(n)f(n-1)+f(n-2),f(0)0,f(1)1.(抱歉现在markdown里面插入latex公式还不会,后面再补咯)。

对于经典的裴波拉契数列:f(n) = f(n-1)+f(n-2), f(0) = 0, f(1) = 1.(抱歉现在markdown里面插入latex公式还不会,后面再补咯)。


  • 直接用递归实现,可以发现,当求f(n-1)时,需要从f(2)到f(n-2)的每一项值,求f(n-2)时需要f(2)到f(n-3)的每一项值,这中间包含了很多的重复,算法复杂度用树来分析,基本是一个满二叉树的节点数目,即O(2^n)。
    如何简化算法复杂度的问题,可以用长度为N的数组存储计算过的值,采用从2到N递推计算的方式,这种方法空间复杂度为O(N), 时间复杂度为O(N).采用求解系数矩阵,直接将[f(n) f(n-1)] 与[f(1) f(0)]联系起来,这样只要求矩阵方幂,并对N进行二进制分解,可将时间复杂度将至O(logN)。

  • 我们对递归方法进行一下优化,可以实现O(N)的时间复杂度,方法就是转化为尾递归:

int fibonacci(int n, int a, int b){
if(n == 0) return b;
else {
return fibonacci(n-1, b, a + b);
}
}

fibonacci(5, 0, 1);//example

这里实际上是将原来用两项f(n) 和 f(n-1)计算的结果放到了一个局部变量a+b中,并且由于该递归为尾递归,即递归部分是最后一步,可以实现原地递归:尾递归优化,不需要对先前的递归调用保留栈帧。这样就可以实现常数空间复杂度。

  • 尾递归来自于更加普通的尾调用:即对某函数的当前函数的最后一步,因此我们可以不用保存当前函数的局部变量,直接进入被调用的函数,因此实现尾调用优化,当函数在最后一步递归调用自身时,就是尾递归。

推荐阅读
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • 本文探讨了符号三角形问题,该问题涉及由相同数量的“+”和“-”符号组成的三角形。通过递归回溯法,可以有效地搜索并计算符合条件的符号三角形的数量。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
author-avatar
白日做梦家_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有