介绍

斐波那契数列(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系列】斐波拉契数列相关推荐

  1. java实现斐波拉契数列

    package algorithm.cxg.Fibonacci;import java.util.Scanner;/*** 实现斐波拉切函数* 斐波拉切数列:* 由0和1开始,之后的费波那西系数就由之 ...

  2. 斐波拉契数列 Java三种实现

    对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...

  3. 经典算法(6)斐波拉契数列、兔子繁殖、跳台阶算法

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  4. HDU1568 Fibonacci【斐波拉契数列】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序

    斐波那契数列数列从第3项开始,每一项都等于前两项之和. 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,25 ...

  6. 深入剖析斐波拉契数列

    深入剖析斐波拉契数列 前言 动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点.本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间 ...

  7. Java实现斐波那契数列与黄金分割比精确位数问题

    题目: 打印输出斐波拉契数列的位数,以及对应的黄金分割值的准确位数,例如(11,4),既是利用11位的斐波拉契数列计算得到的黄金分割数可以准确到小数点后四位.设定一个具体的精确度(例如小数点后10位) ...

  8. 【蓝桥基础练习】斐波拉契数列;杨辉三角形;查找整数;特殊回文数;特殊的数字

    ①试题 基础练习 Fibonacci数列 资源限制 内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 Fibonacci数列 ...

  9. [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 ...

最新文章

  1. Spline interpolation and Savitzki-Golay smoothing
  2. shell 判断_shell之条件判断和流程控制
  3. 汇编语言--CPU对外设的控制
  4. Coursera ML笔记 - 神经网络(Learning)
  5. 【城市沙龙】LiveVideoStack Meet|南京:互联网沙漠的音视频发展
  6. 逆向映射是干嘛的anon_vma, vma, anon_vma_chain
  7. HTML表格和HTML表单
  8. python中常用的os模块
  9. 2021年高考成绩查询贵州一本线,2021年贵州高考一本分数线预测,今年贵州一本分数线预估多少分...
  10. list 集合 分页 三种实现方式,include jdk8 --stream
  11. idea 项目启动找不到页面问题和run/debug只能启动一个的问题
  12. 下拉选择框 其他_WPS表格下拉菜单的多种做法(一)
  13. html5 廖雪峰,廖雪峰 JavaScript Python Git 教程.pdf-原创力文档
  14. java虚拟机扫盲文
  15. 快速实现微信公众号支付功能
  16. if单选,双选,多选及switch多选择结构
  17. effective stl 第31条:了解与各种排序相关的选择
  18. 经典的“外行管内行”案例
  19. 火狐主页被篡改后的修复办法
  20. 用XAMPP搭建本地:Web服务器,访问服务器,下载服务器。

热门文章

  1. iOS开发效率篇——Xcode优秀插件使用(持续更新中)
  2. Coursera | Introduction to Data Analytics(IBM) | Quiz答案
  3. 在iPhone应用里直接打开app store 评论页面的方法
  4. 苹果接盘曼联被辟谣/ 特斯拉FSD北美完全开放/ 马斯克脑机接口准备人体试验/ 微软收购暴雪遇阻…今日更多新鲜事在此...
  5. 《乌合之众》中的50金句
  6. Windows系统的桌面部署Desktop Deployment(4)
  7. 云POS连锁版收银系统免费试用 超市连锁收银软件免费注册
  8. 验证中文名字---正则表达式
  9. 该建议在如何获取和安装破解应用程序的Andr​​oid正确
  10. NER任务中BERT-CRF 模型的英文数据padding与aligning