斐波那契数列 相关问题 详解
斐波那契数列相关问题详解
斐波那契数列及其相关问题是算法学习中的经典主题,变形与应用非常广泛,涵盖了递推关系、动态规划、组合数学、数论等多个领域。以下是斐波那契数列的相关问题及其解法的详解。
1. 经典斐波那契数列
定义
- 初始条件: F ( 0 ) = 0 , F ( 1 ) = 1 F(0) = 0, F(1) = 1 F(0)=0,F(1)=1
- 递推公式: F ( n ) = F ( n − 1 ) + F ( n − 2 ) ( n ≥ 2 ) F(n) = F(n-1) + F(n-2) \ (n \geq 2) F(n)=F(n−1)+F(n−2) (n≥2)
问题类型
- 求第 n n n 项的值。
- 生成前 n n n 项。
- 优化时间复杂度。
解法
- 递归解法(时间复杂度: O ( 2 n ) O(2^n) O(2n),会有大量重复计算)
- 动态规划解法(时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( n ) O(n) O(n) 或 O ( 1 ) O(1) O(1))
- 矩阵快速幂解法(时间复杂度: O ( log n ) O(\log n) O(logn))
实现代码
递归解法:
public class Fibonacci {public static int fibRecursive(int n) {if (n == 0) return 0;if (n == 1) return 1;return fibRecursive(n - 1) + fibRecursive(n - 2);}public static void main(String[] args) {System.out.println(fibRecursive(10)); // 输出:55}
}
动态规划解法:
public class Fibonacci {public static int fibDP(int n) {if (n == 0) return 0;if (n == 1) return 1;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}public static void main(String[] args) {System.out.println(fibDP(10)); // 输出:55}
}
2. 斐波那契数列的模运算
问题
当 n n n 很大时,直接计算斐波那契数会导致数值爆炸。引入模运算解决:
F ( n ) = ( F ( n − 1 ) + F ( n − 2 ) ) m o d M F(n) = (F(n-1) + F(n-2)) \mod M F(n)=(F(n−1)+F(n−2))modM
解法
- 使用动态规划加模运算。
- 结合矩阵快速幂和模运算。
实现代码
public class FibonacciMod {public static int fibMod(int n, int mod) {if (n == 0) return 0;if (n == 1) return 1;int prev1 = 0, prev2 = 1;for (int i = 2; i <= n; i++) {int temp = (prev1 + prev2) % mod;prev1 = prev2;prev2 = temp;}return prev2;}public static void main(String[] args) {System.out.println(fibMod(1000, 1000000007)); // 输出大数的模值}
}
3. 变形斐波那契数列
问题1:三阶斐波那契数列
递推关系扩展为:
F ( n ) = F ( n − 1 ) + F ( n − 2 ) + F ( n − 3 ) F(n) = F(n-1) + F(n-2) + F(n-3) F(n)=F(n−1)+F(n−2)+F(n−3)
实现代码
public class Tribonacci {public static int tribonacci(int n) {if (n == 0) return 0;if (n == 1 || n == 2) return 1;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = dp[2] = 1;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];}return dp[n];}public static void main(String[] args) {System.out.println(tribonacci(10)); // 输出:149}
}
问题2:带权斐波那契数列
递推关系为:
F ( n ) = a ⋅ F ( n − 1 ) + b ⋅ F ( n − 2 ) F(n) = a \cdot F(n-1) + b \cdot F(n-2) F(n)=a⋅F(n−1)+b⋅F(n−2)
实现代码
public class WeightedFibonacci {public static int weightedFib(int n, int a, int b) {if (n == 0) return 0;if (n == 1) return 1;int[] dp = new int[n + 1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = a * dp[i - 1] + b * dp[i - 2];}return dp[n];}public static void main(String[] args) {System.out.println(weightedFib(5, 2, 1)); // 输出:29}
}
问题3:斐波那契数列求和
求斐波那契数列前 n n n 项的和:
S ( n ) = F ( 0 ) + F ( 1 ) + ⋯ + F ( n ) S(n) = F(0) + F(1) + \dots + F(n) S(n)=F(0)+F(1)+⋯+F(n)
通过公式:
S ( n ) = F ( n + 2 ) − 1 S(n) = F(n+2) - 1 S(n)=F(n+2)−1
实现代码
public class FibonacciSum {public static int fibSum(int n) {if (n == 0) return 0;int a = 0, b = 1;int sum = 1; // F(0) + F(1)for (int i = 2; i <= n; i++) {int temp = a + b;a = b;b = temp;sum += b;}return sum;}public static void main(String[] args) {System.out.println(fibSum(5)); // 输出:12}
}
4. 斐波那契数列在矩阵中的应用
问题
斐波那契数列可以通过矩阵的形式来表示,其递推关系可以写成:
[ F ( n ) F ( n − 1 ) ] [ 1 1 1 0 ] ⋅ [ F ( n − 1 ) F ( n − 2 ) ] \begin{bmatrix}F(n) \\F(n-1)\end{bmatrix} \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} F(n-1) \\ F(n-2) \end{bmatrix} [F(n)F(n−1)][1110]⋅[F(n−1)F(n−2)]
利用矩阵快速幂,可以在 O ( log n ) O(\log n) O(logn) 时间内计算第 n n n 项。
实现代码
public class FibonacciMatrix {public static int fibMatrix(int n) {if (n == 0) return 0;if (n == 1) return 1;int[][] F = {{1, 1}, {1, 0}};power(F, n - 1);return F[0][0];}private static void power(int[][] F, int n) {if (n == 0 || n == 1) return;int[][] M = {{1, 1}, {1, 0}};power(F, n / 2);multiply(F, F);if (n % 2 != 0) multiply(F, M);}private static void multiply(int[][] F, int[][] M) {int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];int w = F[1][0] * M[0][1] + F[1][1] * M[1][1];F[0][0] = x;F[0][1] = y;F[1][0] = z;F[1][1] = w;}public static void main(String[] args) {System.out.println(fibMatrix(10)); // 输出:55}
}
5. 斐波那契数列相关优化问题
问题:优化空间复杂度
通过滚动数组,仅存储最近两项,空间复杂度从 O ( n ) O(n) O(n) 降低到 O ( 1 ) O(1) O(1):
public class OptimizedFibonacci {public static int fib(int n) {if (n == 0) return 0;if (
n == 1) return 1;int a = 0, b = 1;for (int i = 2; i <= n; i++) {int temp = a + b;a = b;b = temp;}return b;}public static void main(String[] args) {System.out.println(fib(10)); // 输出:55}
}
总结
- 核心公式:斐波那契数列通过简单的递推公式定义,但其变形和扩展非常广泛。
- 常见问题:包括求第 n n n 项、斐波那契数列求和、模运算、变形数列、矩阵快速幂等。
- 优化方向:在空间复杂度和时间复杂度上,可以通过动态规划、矩阵快速幂等方法进行优化。
相关文章:
斐波那契数列 相关问题 详解
斐波那契数列相关问题详解 斐波那契数列及其相关问题是算法学习中的经典主题,变形与应用非常广泛,涵盖了递推关系、动态规划、组合数学、数论等多个领域。以下是斐波那契数列的相关问题及其解法的详解。 1. 经典斐波那契数列 定义 初始条件࿱…...
Pytorch微调深度学习模型
在公开数据训练了模型,有时候需要拿到自己的数据上微调。今天正好做了一下微调,在此记录一下微调的方法。用Pytorch还是比较容易实现的。 网上找了很多方法,以及Chatgpt也给了很多方法,但是不够简洁和容易理解。 大体步骤是&…...
springboot 使用笔记
1.springboot 快速启动项目 注意:该启动只是临时启动,不能关闭终端面板 cd /www/wwwroot java -jar admin.jar2.脚本启动 linux shell脚本启动springboot服务 3.java一键部署springboot 第5条 https://blog.csdn.net/qq_30272167/article/details/1…...
网络安全基础——网络安全法
填空题 1.根据**《中华人民共和国网络安全法》**第二十条(第二款),任何组织和个人试用网路应当遵守宪法法律,遵守公共秩序,遵守社会公德,不危害网络安全,不得利用网络从事危害国家安全、荣誉和利益,煽动颠…...
SCAU软件体系结构实验四 组合模式
目录 一、题目 二、源码 一、题目 个人(Person)与团队(Team)可以形成一个组织(Organization):组织有两种:个人组织和团队组织,多个个人可以组合成一个团队,不同的个人与团队可以组合成一个更大的团队。 使用控制台或者JavaFx界面…...
Amazon商品详情API接口:电商创新与用户体验的驱动力
在电子商务蓬勃发展的今天,作为全球最大的电商平台之一,亚马逊(Amazon)凭借其强大的技术实力和丰富的商品资源,为全球用户提供了优质的购物体验。其中,Amazon商品详情API接口在电商创新与用户体验提升方面扮…...
手机无法连接服务器1302什么意思?
你有没有遇到过手机无法连接服务器,屏幕上显示“1302”这样的错误代码?尤其是在急需使用手机进行工作或联系朋友时,突然出现的连接问题无疑会带来不少麻烦。那么,什么是1302错误,它又意味着什么呢? 1302错…...
Android adb shell dumpsys audio 信息查看分析详解
Android adb shell dumpsys audio 信息查看分析详解 一、前言 Android 如果要分析当前设备的声音通道相关日志, 仅仅看AudioService的日志是看不到啥日志的,但是看整个audio关键字的日志又太多太乱了, 所以可以看一下系统提供的一个调试指令…...
Python 网络爬虫操作指南
网络爬虫是自动化获取互联网上信息的一种工具。它广泛应用于数据采集、分析以及实现信息聚合等众多领域。本文将为你提供一个完整的Python网络爬虫操作指南,帮助你从零开始学习并实现简单的网络爬虫。我们将涵盖基本的爬虫概念、Python环境配置、常用库介绍。 上传…...
基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI15KHz,f23KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。 1)…...
JavaScript的基础数据类型
一、JavaScript中的数组 定义 数组是一种特殊的对象,用于存储多个值。在JavaScript中,数组可以包含不同的数据类型,如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式: 字面量表示法:let fruits [apple…...
第三讲 架构详解:“隐语”可信隐私计算开源框架
目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…...
JDBC编程---Java
目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后ÿ…...
Python绘制太极八卦
文章目录 系列目录写在前面技术需求1. 图形绘制库的支持2. 图形绘制功能3. 参数化设计4. 绘制控制5. 数据处理6. 用户界面 完整代码代码分析1. rset() 函数2. offset() 函数3. taiji() 函数4. bagua() 函数5. 绘制过程6. 技术亮点 写在后面 系列目录 序号直达链接爱心系列1Pyth…...
Spring框架特性及包下载(Java EE 学习笔记04)
1 Spring 5的新特性 Spring 5是Spring当前最新的版本,与历史版本对比,Spring 5对Spring核心框架进行了修订和更新,增加了很多新特性,如支持响应式编程等。 更新JDK基线 因为Spring 5代码库运行于JDK 8之上,所以Spri…...
Linux关于vim的笔记
Linux关于vim的笔记:(vimtutor打开vim 教程) --------------------------------------------------------------------------------------------------------------------------------- 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键…...
linux mount nfs开机自动挂载远程目录
要在Linux系统中实现开机自动挂载NFS共享目录,你需要编辑/etc/fstab文件。以下是具体步骤和示例: 确保你的系统已经安装了NFS客户端。如果没有安装,可以使用以下命令安装: sudo apt-install nfs-common 编辑/etc/fstab文件&#…...
【vue】导航守卫
什么是导航守卫 在vue路由切换过程中对行为做个限制 全局前置守卫 route.beforeEach((to, from, next)) > {// to是切换到的路由// from是正要离开的路由// next控制是否允许进入目标路由next(false); //不允许 }路由级别的导航守卫 const routes [{path: /User,name: U…...
基于Matlab实现LDPC编码
在无线通信和数据存储领域,LDPC(低密度奇偶校验码)编码是一种高效、纠错能力强大的错误校正技术。本MATLAB仿真程序全面地展示了如何在AWGN(加性高斯白噪声)信道下应用LDPC编码与BPSK(二进制相移键控&#…...
PostgreSQL 中约束Constraints
在 PostgreSQL 中,约束(Constraints)是用于限制进入数据库表中数据的规则。它们确保数据的准确性和可靠性,通过定义规则来防止无效数据的插入或更新。PostgreSQL 支持多种类型的约束,每种约束都有特定的用途和语法。以…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题
2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题 (二)模块 A:安全事件响应、网络安全数据取证、应用安全、系统安全任务一:漏洞扫描与利用:任务二:Windows 操作系统渗透测试 :任务三&…...
