当前位置: 首页 > news >正文

《笔记》青蛙跳台阶——斐波那契数列

斐波那契数列

斐波那契数列(Fibonacci Sequence)是一个经典的数学数列,其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1(或 1 和 1),后续每一项都是前两项的和。


斐波那契数列的定义

斐波那契数列的定义如下:

  • ( F(0) = 0 )
  • ( F(1) = 1 )
  • 对于 ( n >= 2 ),( F(n) = F(n-1) + F(n-2) )
    数列的前几项为:
    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

斐波那契数列的性质

在这里插入图片描述


斐波那契数列的应用

  1. 自然界中的斐波那契数列

    • 植物的叶子排列、花瓣数量、松果的鳞片等都与斐波那契数列有关。
    • 例如,向日葵的花瓣数量通常是斐波那契数列中的某个数。
  2. 计算机科学

    • 斐波那契数列常用于算法设计和动态规划问题。
    • 例如,青蛙跳台阶问题、爬楼梯问题等。
  3. 金融领域

    • 斐波那契数列在技术分析中用于预测股票价格的支撑位和阻力位。
  4. 艺术与设计

    • 黄金分割比例(与斐波那契数列相关)被广泛应用于建筑、绘画和设计中。

斐波那契数列的实现

以下是斐波那契数列的几种常见实现方式:

1. 递归实现

def fibonacci(n):if n == 0:return 0if n == 1:return 1return fibonacci(n - 1) + fibonacci(n - 2)

测试

print(fibonacci(10)) # 输出 55

  1. 动态规划实现

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

测试

print(fibonacci(10)) # 输出 55

优点:

时间复杂度为 O(n),空间复杂度为 O(n)。
  1. 优化空间复杂度的动态规划
def fibonacci(n):if n == 0:return 0if n == 1:return 1prev1 = 0  # F(n-2)prev2 = 1  # F(n-1)for i in range(2, n + 1):current = prev1 + prev2prev1 = prev2prev2 = currentreturn prev2

测试

print(fibonacci(10)) # 输出 55

优点:

时间复杂度为 O(n),空间复杂度为 O(1)。
  1. 矩阵快速幂实现
import numpy as npdef fibonacci(n):if n == 0:return 0def matrix_power(matrix, power):result = np.identity(2, dtype=object)while power > 0:if power % 2 == 1:result = np.dot(result, matrix)matrix = np.dot(matrix, matrix)power = power // 2return resultmatrix = np.array([[1, 1], [1, 0]], dtype=object)result_matrix = matrix_power(matrix, n - 1)return result_matrix[0][0]

测试

print(fibonacci(10)) # 输出 55

优点:

时间复杂度为 O(logn),适合计算大数的斐波那契数列。

总结

斐波那契数列是一个经典的数学问题,具有广泛的应用场景。通过递归、动态规划、矩阵快速幂等方法,可以高效地计算斐波那契数列的值。在实际应用中,动态规划和矩阵快速幂是最常用的方法。

http://www.lryc.cn/news/518630.html

相关文章:

  • SpringBoot3动态切换数据源
  • OSPF - 特殊区域
  • Linux 系统下磁盘相关指令:df、du、fdisk、lsblk
  • 基于单片机的肺功能MVV简单测算
  • 如何用Python编程实现自动整理XML发票文件
  • 腾讯云AI代码助手编程挑战赛-百事一点通
  • Spring学习笔记1
  • LeetCode 2185. Counting Words With a Given Prefix
  • 图漾相机基础操作
  • 前端开发中页面优化的方法
  • Qt QDockWidget详解以及例程
  • 机器学习之贝叶斯分类器和混淆矩阵可视化
  • 关于大数据的基础知识(一)——定义特征结构要素
  • 2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅
  • 【MyBatis-Plus 进阶功能】开发中常用场景剖析
  • 【C++/控制台】2048小游戏
  • Linux 中 top 命令的使用与实例解读
  • C++ STL 中的 `unordered_map` 和 `unordered_set` 总结
  • 机器学习基础-概率图模型
  • 【MySQL】九、表的内外连接
  • 芯片详细讲解,从而区分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU
  • halcon三维点云数据处理(十)locate_cylinder_3d
  • vue(2,3), react (16及以上)开发者工具资源
  • 2025年华为OD上机考试真题(Java)——整数对最小和
  • 进程间通信——网络通信——UDP
  • 【我的 PWN 学习手札】IO_FILE 之 FSOP
  • 新兴的开源 AI Agent 智能体全景技术栈
  • 统计学习方法(第二版) 概率分布学习
  • 淺談Cocos2djs逆向
  • 【ROS2】RViz2加载URDF模型文件