Java面试之斐波那契数列(Fibonacci)及其应用:青蛙跳台阶问题

news2025/1/17 0:28:23

文章目录

  • 一、斐波那契数列问题
    • 1.1 题目
    • 1.2 什么是斐波那契数列
    • 1.3 效率很低的解法:递归
    • 1.4 递归缺点分析
  • 二、比较好的解决办法
    • 2.1 保存数列中间项
    • 2.2 从下往上计算
  • 三、公式法
  • 四、青蛙跳台阶问题
    • 4.1 题目及分析
    • 4.2 代码实现


一、斐波那契数列问题

1.1 题目

写一个函数,输入n,求斐波那契数列的第n项。
斐波那契数列定义如下:
在这里插入图片描述

1.2 什么是斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……
在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

1.3 效率很低的解法:递归

public int Fibonacci(int n){
	if(n <= 0){
		return 0;
	}
	if(n <= 1){
		return 1;
	}
	return Fibonacci(n-1) + Fibonacci(n-2);
}

1.4 递归缺点分析

在这里插入图片描述
递归的代码虽然简洁,但是这并不是一个很好的解法,因为存在很严重的效率问题。
从图中可以看出,想要求f(n),就要先求出f(n-1)和f(n-2),同样想要求f(n-1),就要先求出f(n-2)和f(n-3)。我们不难发现这棵树中有很多重复的节点,并且重复节点随着n增大急剧增加,这个时间复杂度以n的指数形式递增。

二、比较好的解决办法

2.1 保存数列中间项

递归之所以慢是因为重复计算太多,我们可以把已经得到的中间项保存起来,下次再使用的时候先查找,如果前面已经计算过的就不用再重复计算了。

public int Fibonacci(int n){
	int[] result = {0,1};
	if(n < 2){
		return result[n];
	}
	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];
}

2.2 从下往上计算

更为简单的方法是从下往上计算,首先根据f(0)和f(1)算出f(2),然后再根据f(1)和f(2)算出f(3)……
时间复杂度为f(n)。

public int Fibonacci(int n){
	int[] result = {0,1};
	if(n < 2){
		return result[n];
	}
	int p = 0;
	int q = 1;
	int res = 0;
	for(int i = 2; i <= n; i++){
		res = p + q;
		p = q;
		q = res;
	}
	return res;
}

三、公式法

在这里插入图片描述

public int fib(int n) {
   	double temp=Math.sqrt(5);
    double ans=(1/temp)*(Math.pow((1+temp)/2,n)-Math.pow((1-temp)/2,n));
    return (int)Math.round(ans);
    //round()函数参数为double型时,返回一个最接近该参数的long型数,参数为float型时,返回一个最接近的int值
}

这种方法的时间复杂度为O(log n),不过公式比较生僻。

四、青蛙跳台阶问题

4.1 题目及分析

题目:
一只青蛙一次可以跳上1级台阶,也可以跳上两级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法。
分析:
简单的情况:
只有一级台阶,只有一种跳法。
有两级台阶,有两种跳法:一种是跳两个一级,一种是跳一个两级。
一般情况:
跳n级台阶看成n的函数f(n)。当n>2时,第一次跳的时候有两种不同的选择,一是第一次只跳一级,跳法数目等于后面n-1级台阶的跳法数目,即f(n-1);二是第一次跳两级,此时跳法等于后面n-2级台阶的跳法数目,即f(n-2)。因此n级台阶的跳法总数f(n) = f(n-1) + f(n-2)。可以看出这就是一个斐波那契数列。

4.2 代码实现

public int frogJump(int n){
	if(n == 1 || n == 2){
        return n;
    }
	int p = 1;
	int q = 2;
	int res = 0;
	for(int i = 3; i <= n; i++){
		res = p + q;
		p = q;
		q = res;
	}
	return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/944246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作鲜花商城小程序的详细步骤

如果你是一个新手商家&#xff0c;想要进入鲜花团购市场&#xff0c;但是不知道如何制作一个小程序商城&#xff0c;那么这篇文章就是为你准备的。以下是制作鲜花团购小程序商城的详细步骤&#xff1a; 1. 登录乔拓云平台后台&#xff0c;进入商城管理页面 首先&#xff0c;你需…

Shopee测评补单技巧:优化商品流量与权重

在Shopee平台上进行测评是一种低成本、高回报的推广方式&#xff0c;可以对商品的流量、转化率、质量分和权重等多个指标起到辅助作用。以下是一些Shopee测评的技巧和注意事项&#xff1a; 1. 测评原理与周期&#xff1a; Shopee的新品周期为7天&#xff0c;平台会在这段时间…

【管理运筹学】第 6 章 | 运输问题(4,表上作业法 |闭回路调整法以及特殊情况 | 产销不平衡的运输问题)

文章目录 引言二、表上作业法2.3 改进的方法 —— 闭回路调整法2.4 表上作业法中的特殊情况&#xff08;一&#xff09;无穷多最优解&#xff08;二&#xff09;退化 三、产销不平衡的运输问题3.1 产量大于销量3.2 销量大于产量 写在最后 引言 接下来我们学习表上作业法的最后…

图论算法基础:单源最短路径Dijkstra算法分析

文章目录 图的邻接矩阵 一.Dijkstra算法分析算法的核心逻辑要素算法的执行逻辑 二.Dijkstra算法接口实现邻接矩阵堆优化版本: 图的邻接矩阵 namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是边的权值的数据类型,MAX_W是权值的上限值(表示不相两)//Direction…

项目 - 后端技术栈转型方案

前言 某开发项目的后端技术栈比较老了&#xff0c;现在想换到新的技术栈上。使用更好的模式、设计思想、更合理的架构等&#xff0c;为未来的需求迭代做铺垫。怎么办呢&#xff1f;假设系统目前在线上运行着的&#xff0c;直接整体换的话耗时太久&#xff0c;且中间还有新的需…

【嵌入式】Keil5自带JLink识别不到芯片(unkown to this version of the jlink software)的处理

目录 一 问题现象 二 原因分析 三 问题处理 一 问题现象 使用了一款新的嵌入式芯片&#xff0c;灵动微MM32SPIN27PF&#xff0c;安装了官方提供的J-Link Pack支持包。 【1】直接使用 JLink_V694a 可以正常烧写程序&#xff1b; 【2】使用Keil5烧写失败&#xff0c;显示报错“…

demo的改进和完善(首页添加介绍和图片)

1.在首页添加介绍 将布局→ 区域→ 静态内容拖拽到body中→ 标题 更改为自己想要的名称→ 源 写入html代码 《学习demo》是用来记录我的学习过程中遇到的问题及解决方案&#xff0c;见证了我的进步和成长 <hr> 相关内容可见<a href"https://blog.csdn.net/clove…

你的住宅安全吗?这个技能赶紧学学

随着城市化的不断加速和人口增长&#xff0c;住宅小区的管理和安全问题也愈发凸显出来。在这种背景下&#xff0c;门禁监控系统成为了一种既有效又实用的解决方案。 门禁监控系统不仅可以控制和管理出入小区的人员和车辆&#xff0c;还可以提供实时监控和记录&#xff0c;为小区…

视频监控/视频汇聚/视频云存储EasyCVR平台HLS流集成在小程序无法播放的问题排查

安防视频/视频云存储/视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频…

实现 Trie (前缀树)

题目链接 实现 Trie (前缀树) 题目描述 注意点 word 和 prefix 仅由小写英文字母组成 解答思路 首先要理解前缀树是什么&#xff0c;参照该篇文章【图解算法】模板变式——带你彻底搞懂字典树(Trie树)在了解前缀树是什么后&#xff0c;设计前缀树就会更加容易&#xff0c;…

java八股文面试[多线程]——主内存和工作内存的关系

JAVA内存模型&#xff08;JMM&#xff09;共享变量&#xff1a;如果一个变量在多个线程的工作内存中都存在副本&#xff0c;那么这个变量就是这几个线程的共享变量。 上面的工作内存其实是java内存模型抽象出来的概念&#xff0c;下面简要介绍一下java内存模型&#xff08;JMM&…

正中优配:股票经手费必须交吗?

在股票出资中&#xff0c;经手费是一个不可避免的要素。那么&#xff0c;股票经手费有必要交吗&#xff1f;从多个视点来看&#xff0c;这个问题需求进行必定的剖析。 法令视点&#xff1a;股票经手费有必要交 从法令视点来看&#xff0c;股票经手费有必要交。依据《证券法》的…

SQL 语句继续学习之记录三

一&#xff0c;数据的插入&#xff08;insert 语句的使用方法&#xff09; 使用insert语句可以向表中插入数据(行)。原则上&#xff0c;insert语句每次执行一行数据的插入。 列名和值用逗号隔开&#xff0c;分别扩在&#xff08;&#xff09;内&#xff0c;这种形式称为清单。…

Llama模型结构解析(源码阅读)

目录 1. LlamaModel整体结构流程图2. LlamaRMSNorm3. LlamaMLP4. LlamaRotaryEmbedding 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/636784644 https://spaces.ac.cn/archives/8265 ——《Transformer升级之路&#xff1a;2、博采众长的旋转式位置编码》 前言&#x…

安科瑞风力发电场集中监控系统解决方案-安科瑞黄安南

作为清洁能源之一&#xff0c;风力发电场近几年装机容量快速增长。8月17日&#xff0c;国家能源局发布1-7月份全国电力工业统计数据。截至7月底&#xff0c;全国累计发电装机容量约27.4亿千瓦&#xff0c;同比增长11.5%。其中&#xff0c;太阳能发电装机容量约4.9亿千瓦&#x…

Oracle数据传输加密方法

服务器端“dbhome_1\NETWORK\ADMIN\”sqlnet.ora文件中添加 SQLNET.ENCRYPTION_SERVER requested SQLNET.ENCRYPTION_TYPES_SERVER (RC4_256) 添加后新的链接即刻生效&#xff0c;服务器无需重新启动。 也可以通过Net manager管理工具添加 各个参数含义如下&#xff1a; 是…

Web开发模式、API接口、restful规范、序列化和反序列化、drf安装和快速使用

一 Web开发模式 1. 前后端混合开发模式 前后端混合开发模式是一种开发方式&#xff0c;将前端和后端的开发工作结合在一起&#xff0c;以加快项目的开发速度和 提高协作效率。这种模式通常用于快速原型开发、小型项目或敏捷开发中。在前后端混合开发模式中&#xff0c;前端和…

【MyBatis】自定义resultMap三种映射关系

目录 一、一对一映射&#xff08;One-to-One&#xff09; 1.1 表关系 1.2 resultMap设置自定义映射 二、一对多映射&#xff08;One-to-Many&#xff09; 2.1 创建实体 2.2 级联方式处理映射关系 2.3 定义SQL 2.4 OrderMapper接口 2.5 编写业务逻辑层 2.6 Junit测试…

港联证券:游资爆炒中电环保,还有谁在蹭核污染防治概念?

8月28日&#xff0c;核污染防治概念股持续大涨&#xff0c;建工修复&#xff08;300958.SZ&#xff09;、捷强配备&#xff08;300875.SZ&#xff09;、东方园林&#xff08;002310.SZ&#xff09;、华盛昌&#xff08;002980.SZ&#xff09;等涨停。 中小市值的概念股成为游资…

人工智能学习专栏

这个专栏就专门用来记录自己的深度学习的历程吧。从做MCU开始、Soc、Linux系统转行到AI领域&#xff0c;其过程是痛苦的。至少数学这块&#xff0c;那是花了很多时间去从头去学。但是还是有很多不懂的地方。坚持&#xff01;&#xff01;&#xff01;&#xff01;