Python 实现斐波那契数列

简介: 本文介绍斐波那契数列的Python实现方法,涵盖递归、迭代与动态规划三种方式,分析其时间与空间复杂度,并比较性能差异。适用于算法学习与实际应用,如金融分析、图形学等场景。

Python 实现斐波那契数列

斐波那契数列简介

斐波那契数列(Fibonacci sequence)是一个经典的数学序列,其定义如下:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) (当 n ≥ 2 时)

这个数列的特点是每个数字都是前两个数字之和,数列开始如下:0, 1, 1, 2, 3, 5, 8, 13, 21, 34...

Python 实现方法

1. 递归实现

示例代码 - shift

def fibonacci_recursive(n):
    if n <= 1:
        return n
    else:
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)

特点:

  • 代码简洁直观
  • 时间复杂度为 O(2^n),效率较低
  • 适合理解递归概念但不适合大规模计算

2. 迭代实现

示例代码 - shift

def fibonacci_iterative(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

特点:

  • 时间复杂度为 O(n)
  • 空间复杂度为 O(1)
  • 适合实际应用场景

3. 动态规划实现

示例代码 - shift

def fibonacci_dp(n):
    if n <= 1:
        return n
    dp = [0] * (n + 1)
    dp[1] = 1
    for i in range(2, n + 1):
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]

特点:

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
  • 可扩展性强,适合更复杂的动态规划问题

性能比较

当 n=35 时:

  • 递归方法:约 900 万次函数调用,耗时明显
  • 迭代方法:35 次循环,几乎瞬间完成

实际应用场景

  1. 金融分析:黄金分割比计算
  2. 算法设计:动态规划问题
  3. 计算机图形学:自然生长模式模拟
  4. 音乐创作:音符排列组合

优化建议

对于需要多次调用的情况,可以考虑:

  • 使用缓存装饰器(Python 的 @lru_cache
  • 预计算并存储结果
  • 使用矩阵快速幂算法(时间复杂度 O(log n))

示例代码 - shift

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci_cached(n):
    if n <= 1:
        return n
    return fibonacci_cached(n-1) + fibonacci_cached(n-2)
相关文章
|
3月前
|
人工智能 数据可视化 安全
阿里云建站:AI万小智,万小智AI建站送.cn域名
万小智是阿里云推出的AI数字员工,面向企业及个人提供AI驱动的自助建站服务。支持对话建站、AI生成配图与内容,预置千套模板,多端适配,可视化拖拽操作,集成云服务器、数据库、CDN等云服务,保障安全高效。活动期间,购建站产品送.CN域名首年免费,新客首年仅99元起,助力用户低成本快速搭建专业官网并实现智能运营。
|
Web App开发
Web QQ自动强制加好友代码
也许见过强行聊天的代码:  tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com&Menu=yes   但是你应该不知道,还有强行加好友的代码: tencent://AddContact/?fromId=45&f...
6519 0
|
4月前
|
前端开发 容器
CSS 的弹性布局
CSS弹性布局通过`display:flex`实现,可灵活控制容器内子元素的排列、对齐与分布。支持主轴与交叉轴方向设置、伸缩比例(flex-grow/shrink)、换行及多行对齐方式,大幅提升网页布局灵活性与响应性。
|
4月前
|
C++ Python
Qt Theme —— 纯 qss 的 Qt 主题
Qt Theme 是一个纯 QSS 实现的 Qt 主题库,支持 C++ 与 Python(PyQt/PySide),提供多种风格与配色,轻松美化界面。可通过 pip 安装或导出资源嵌入项目,兼容 WebAssembly 在线预览。
302 109
|
3月前
|
存储 运维 资源调度
JMeter自搭与商用压测平台:效率成本对比及最优方案推荐
文章对比了JMeter自搭与商用压测平台的效率与成本,分析两者在灵活性、技术门槛、成本投入等方面的差异。指出自建适合技术强的团队,商用适合资源有限的中小团队,并给出结合业务需求、技术能力等因素选择最优方案的建议。
|
4月前
|
传感器 人工智能 运维
水利数字孪生技术深度分享
水利数字孪生融合物联网、大数据、AI等技术,构建物理水利系统的全要素虚拟映射,实现精准感知、智能仿真与优化调控。涵盖BIM-GIS建模、实时数据链、仿真引擎与可视化交互,应用于防洪调度、工程运维、水资源管理等领域。济南奥维数字科技通过自主引擎与场景实践,推动技术落地,助力“数字济南”建设,引领行业智能化升级。
455 0
|
10月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
424 22
|
存储 Java Docker
使用Docker部署Java应用的最佳实践
使用Docker部署Java应用的最佳实践
|
12月前
|
SQL JSON NoSQL
esProc SPL vs DuckDB:多源数据处理谁更胜一筹?
DuckDB 和 esProc SPL 均支持多数据源处理,但在功能和灵活性上存在差异。DuckDB 支持常见文件格式(如 CSV、Parquet)、云存储及部分关系型数据库,依赖专用连接器,扩展性有限;esProc 数据源支持更广泛,涵盖多种本地文件、数据库(关系型与 NoSQL)、云存储及远程数据源,使用 Native 接口封装,扩展简便,适合多数据源混合计算。 在数据处理方面,DuckDB 对 CSV 和 Parquet 文件支持成熟,复杂计算需借助 Python,存在体系割裂;esProc 提供 双语法,尤其 SPL 在复杂计算和 JSON 多层结构处理上表现更直观高效。
|
移动开发 JavaScript 数据管理
HTML5 拖放在游戏中的应用
HTML5的拖放功能在游戏开发中广泛应用,尤其在创建交互式网页游戏时。它支持多种场景,如拖动角色或物品、选择和装备物品、拼图或配对游戏以及自定义界面布局。通过简单的HTML和JavaScript代码,可实现流畅的拖放交互,并提供视觉反馈,增强用户体验。此外,还需考虑设备兼容性和数据管理,确保游戏在不同设备和浏览器上都能良好运行。总之,HTML5拖放功能使网页游戏更生动有趣。