【Java系列】斐波拉契数列
介绍
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
Java编码实现斐波那契数列
方案1:递归
根据斐波那契数列的数学表示方式:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
很容易就可以得出;
package com.example.demo;/*** @author Biyu* @projectName demo* @className: Fibonacci* @description //TODO* @date: 2023-01-05 */
public class Fibonacci {public static void main(String[] args) {for (int i = 1; i <= 10; i++){System.out.printf("Fibonacci of %d is: %d\n", i, fib1(i));}}public static int fib1(int n) {if(n <= 2) {return 1;}return fib1(n - 1) + fib1(n - 2);}
}
问题:使用以上代码完成斐波那契数列,时间复杂度是0(n^2),空间复杂度是0(n);
方案2: 将递归转化为非递归优化
定义一个数组存放,存放斐波拉契数列每一项数据;免去递归调用;
package com.example.demo;/*** @author Biyu* @projectName demo* @className: Fibonacci* @description //TODO* @date: 2023-01-05 */
public class Fibonacci {public static void main(String[] args) {for (int i = 1; i <= 10; i++){System.out.printf("Fibonacci of %d is: %d\n", i, fib2(i));}}public static int fib2(int n) {if(n <= 2) return 1;int[] array = new int[n + 1];array[1] = array[2] = 1;for (int i = 3; i <= n; i++) {array[i] = array[i - 1] + array[i - 2];}return array[n];}
}
空间复杂度:额外定义了一个数组;空间复杂度依然是0(n),但是没有递归产生的空间。
时间复杂度:时间复杂度是0(n)
方案3:定义2个变量代替数组
package com.example.demo;/*** @author Biyu* @projectName demo* @className: Fibonacci* @description //TODO* @date: 2023-01-05 */
public class Fibonacci {public static void main(String[] args) {for (int i = 1; i <= 10; i++){System.out.printf("Fibonacci of %d is: %d\n", i, fib3(i));}}public static int fib3(int n) {if(n <= 2) {return 1;}int n1 = 1;int n2 = 1;for (int i=3;i<=n;i++) {n2 = n1 + n2;n1 = n2 - n1;}return n2;}
}
空间复杂度:不需要额外定义数组,只定义2个变量即可,所以空间复杂度0(1);
时间复杂度:时间复杂度是0(n)
方案4:利用尾递归实现,java可以对尾递归的栈空间优化
package com.example.demo;/*** @author Biyu* @projectName demo* @className: Fibonacci* @description //TODO* @date: 2023-01-05 */
public class Fibonacci {public static void main(String[] args) {for (int i = 1; i <= 10; i++){System.out.printf("Fibonacci of %d is: %d\n", i, fib4(i));}}public static int fib4(int n) {return fib4(n,1,1);}public static int fib4(int n, int n1,int n2) {if(n <= 2) {return n2;}return fib4(n - 1,n2,n1+n2);}
}
空间复杂度:递归的深度为0(n),但是由于是尾递归,优化后的空间复杂度是0(1)
时间复杂度:时间复杂度是0(n)
【Java系列】斐波拉契数列相关推荐
- java实现斐波拉契数列
package algorithm.cxg.Fibonacci;import java.util.Scanner;/*** 实现斐波拉切函数* 斐波拉切数列:* 由0和1开始,之后的费波那西系数就由之 ...
- 斐波拉契数列 Java三种实现
对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...
- 经典算法(6)斐波拉契数列、兔子繁殖、跳台阶算法
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...
- HDU1568 Fibonacci【斐波拉契数列】
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序
斐波那契数列数列从第3项开始,每一项都等于前两项之和. 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,25 ...
- 深入剖析斐波拉契数列
深入剖析斐波拉契数列 前言 动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点.本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间 ...
- Java实现斐波那契数列与黄金分割比精确位数问题
题目: 打印输出斐波拉契数列的位数,以及对应的黄金分割值的准确位数,例如(11,4),既是利用11位的斐波拉契数列计算得到的黄金分割数可以准确到小数点后四位.设定一个具体的精确度(例如小数点后10位) ...
- 【蓝桥基础练习】斐波拉契数列;杨辉三角形;查找整数;特殊回文数;特殊的数字
①试题 基础练习 Fibonacci数列 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 Fibonacci数列 ...
- [python]练习之递归和循环实现斐波拉契数列
1 # 程序功能:用递归和循环实现斐波拉契数列 2 # 0 1 1 2 3 5 8 13 21 34 3 4 def digui_fibo(number): 5 if number == 1: 6 r ...
最新文章
- Spline interpolation and Savitzki-Golay smoothing
- shell 判断_shell之条件判断和流程控制
- 汇编语言--CPU对外设的控制
- Coursera ML笔记 - 神经网络(Learning)
- 【城市沙龙】LiveVideoStack Meet|南京:互联网沙漠的音视频发展
- 逆向映射是干嘛的anon_vma, vma, anon_vma_chain
- HTML表格和HTML表单
- python中常用的os模块
- 2021年高考成绩查询贵州一本线,2021年贵州高考一本分数线预测,今年贵州一本分数线预估多少分...
- list 集合 分页 三种实现方式,include jdk8 --stream
- idea 项目启动找不到页面问题和run/debug只能启动一个的问题
- 下拉选择框 其他_WPS表格下拉菜单的多种做法(一)
- html5 廖雪峰,廖雪峰 JavaScript Python Git 教程.pdf-原创力文档
- java虚拟机扫盲文
- 快速实现微信公众号支付功能
- if单选,双选,多选及switch多选择结构
- effective stl 第31条:了解与各种排序相关的选择
- 经典的“外行管内行”案例
- 火狐主页被篡改后的修复办法
- 用XAMPP搭建本地:Web服务器,访问服务器,下载服务器。
热门文章
- iOS开发效率篇——Xcode优秀插件使用(持续更新中)
- Coursera | Introduction to Data Analytics(IBM) | Quiz答案
- 在iPhone应用里直接打开app store 评论页面的方法
- 苹果接盘曼联被辟谣/ 特斯拉FSD北美完全开放/ 马斯克脑机接口准备人体试验/ 微软收购暴雪遇阻…今日更多新鲜事在此...
- 《乌合之众》中的50金句
- Windows系统的桌面部署Desktop Deployment(4)
- 云POS连锁版收银系统免费试用 超市连锁收银软件免费注册
- 验证中文名字---正则表达式
- 该建议在如何获取和安装破解应用程序的Andr​​oid正确
- NER任务中BERT-CRF 模型的英文数据padding与aligning