斐波那契算法

斐波那契数列

斐波那契数列(Fibonacci sequence)是一个非常著名的数学序列,它是由意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci)在1202年的著作《计算之书》(Liber Abaci)中首次引入的。这个数列的定义如下:

  1. 数列的前两个数是 0 和 1。
  2. 从第三个数开始,每个数都是前两个数的和。

用数学公式表示,斐波那契数列可以写成:

F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) 对于 n > 1 的所有自然数 n。

斐波那契数列的前几个数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

这个数列在数学、科学、艺术和自然界中都有广泛的应用。例如,在生物学中,许多植物的生长模式(如菠萝的鳞片排列、向日葵的种子排列)遵循斐波那契数列。在艺术和设计中,黄金分割比例(Golden Ratio),也称为黄金比例(Golden Proportion),大约是1.618,这个比例与斐波那契数列紧密相关。

斐波那契数列的第n项可以通过递归、迭代或使用闭式公式(Binet’s Formula)来计算。闭式公式如下:

F(n) = (φ^n - (-φ)^-n) / sqrt(5)

其中,φ (phi) 是黄金比例,约等于1.618033988749895…,是(1 + sqrt(5)) / 2 的结果。这个公式可以直接计算出数列的任意一项,而不需要计算前面的所有项。

Java语言书写

在Java语言中,实现斐波那契数列可以通过多种方法,包括递归、迭代和使用矩阵快速幂。以下是这三种方法的详细实现:

  1. 递归方法
    递归方法是最直接的实现方式,但它的效率不高,因为会有很多重复的计算。
public class Fibonacci {public static int fibonacciRecursive(int n) {if (n <= 1) {return n;} else {return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);}}public static void main(String[] args) {int n = 10; // 计算前10项for (int i = 0; i < n; i++) {System.out.print(fibonacciRecursive(i) + " ");}}
}
  1. 迭代方法
    迭代方法效率更高,因为它避免了重复计算。
public class Fibonacci {public static int fibonacciIterative(int n) {if (n <= 1) {return n;}int fib = 1;int prevFib = 1;for (int i = 2; i < n; i++) {int temp = fib;fib += prevFib;prevFib = temp;}return fib;}public static void main(String[] args) {int n = 10; // 计算前10项for (int i = 0; i < n; i++) {System.out.print(fibonacciIterative(i) + " ");}}
}
  1. 矩阵快速幂方法(Binet’s Formula):
    这种方法利用了斐波那契数列的闭式公式,通过矩阵乘法快速计算。
public class Fibonacci {public static int fibonacciMatrix(int n) {if (n == 0) {return 0;}int m = (int) Math.pow(5, 0.5);int[][] result = {{1, 1}, {1, 0}};int[][] base = {{1, 1}, {1, 0}};while (n > 0) {if (n % 2 == 1) {multiply(result, base, result);}multiply(base, base, base);n /= 2;}return result[0][0];}private static void multiply(int[][] a, int[][] b, int[][] result) {for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {result[i][j] = 0;for (int k = 0; k < 2; k++) {result[i][j] += (long)a[i][k] * b[k][j] % m;}}}}public static void main(String[] args) {int n = 10; // 计算第10项System.out.println(fibonacciMatrix(n));}
}

在这个例子中,我们使用了黄金比例的平方根(m)来取模,以避免在计算过程中出现大数。这种方法的时间复杂度是O(log n),因为它基于二分法。

请注意,由于Java的整数类型(int)在处理大数时可能会溢出,所以在实际应用中,你可能需要使用long类型或者Java的BigInteger类来处理更大的斐波那契数。

需求场景:一个在线购物网站

一个在线购物网站想要在商品详情页面展示一个“推荐商品”区域,该区域会根据用户浏览的商品推荐相似的商品。为了实现这个功能,网站决定使用斐波那契数列来决定推荐商品的顺序,即推荐商品的顺序基于斐波那契数列的索引。例如,如果用户正在查看索引为5的商品(从0开始计数),那么推荐系统会推荐索引为3(F(3)=2)、2(F(2)=1)、1(F(1)=1)的商品。

解决步骤:

  1. 创建一个Java方法来生成斐波那契数列的前N项。
  2. 在商品详情页面的后端逻辑中,使用这个方法来获取推荐商品的索引。
  3. 根据这些索引从数据库中检索推荐商品并展示在页面上。

以下是实现这个需求的Java代码示例:

import java.util.ArrayList;
import java.util.List;public class FibonacciRecommendation {// 生成斐波那契数列的前N项public static List<Integer> generateFibonacci(int N) {List<Integer> fibonacciSeries = new ArrayList<>();int a = 0, b = 1, c = 0;// 初始化前两项fibonacciSeries.add(a);if (N > 1) {fibonacciSeries.add(b);}// 计算剩余的项for (int i = 2; i < N; i++) {c = a + b;fibonacciSeries.add(c);a = b;b = c;}return fibonacciSeries;}// 获取推荐商品的索引public static List<Integer> getRecommendedIndices(int currentProductIndex, int N) {List<Integer> recommendedIndices = new ArrayList<>();// 获取斐波那契数列List<Integer> fibonacciSeries = generateFibonacci(N);// 计算推荐商品的索引for (int index : fibonacciSeries) {if (index <= currentProductIndex) {recommendedIndices.add(currentProductIndex - index);}}return recommendedIndices;}// 主方法,用于测试public static void main(String[] args) {// 假设用户正在查看索引为5的商品int currentProductIndex = 5;int N = 10; // 推荐商品的数量// 获取推荐商品的索引List<Integer> indices = getRecommendedIndices(currentProductIndex, N);// 输出推荐商品的索引System.out.println("推荐商品的索引:" + indices);}
}

在这个例子中,generateFibonacci方法用于生成斐波那契数列的前N项。getRecommendedIndices方法接受当前商品的索引和推荐商品的数量N,然后返回一个推荐商品的索引列表。在main方法中,我们测试了这个逻辑,假设用户正在查看索引为5的商品,并获取了推荐商品的索引。

请注意,这个例子是一个简化的版本,实际应用中可能需要考虑商品数据库的查询逻辑、用户偏好、商品的相似度等因素。此外,为了避免索引越界,实际应用中可能需要对推荐逻辑进行更复杂的处理。

需求:兔子问题(斐波那契数列)。

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?由此可见兔子对象的数据是:1 , 1 , 2 , 3 , 5 , 8 …

首先我们对其数据进行分析,可知从第三天开始,每天的兔子数量等于前两天之和,其次我们要知道递归的思想:
递归:在方法中调用方法本身的现象。注意事项:1.递归要有出口 2.递归次数不宜过多 3.递归所体现的思想,就是拆分合并的思想
public static void main(String[] args) {//定义一个方法去实现逻辑,传入月数并接收其返回值int sum = sumRabbit(20);//打印结果System.out.println("兔子的对数为:" + sum);}private static int sumRabbit(int i) {//判断传来的月数是不是第1个月或者两个月,如果是则返回1if (i == 1 || i == 2) {return 1;} else {//如果传来的月数不是1或者2,那么返回前两个月兔子数量的和;这里采用了递归的思想return sumRabbit(i - 1) + sumRabbit(i - 2);}}public class Demo5_2 {public static void main(String[] args) {System.out.println(fibonacci(5));}/*** 计算斐波那契数列  黄金分割线* @param month* @return*/public static int fibonacci(int month){
//        第一   1
//        第二   1
//        第三   2   第一月+ 第二月
//        第四月  3   第二月+ 第三月
//        第五月  5
//        第n月   ?   第n-1 + 第n-2
//        创建数组int[] arr = new int[month];arr[0] = 1;arr[1] = 1;for (int i = 2; i < arr.length; i++) {arr[i] = arr[i-1]+ arr[i-2];}System.out.println(Arrays.toString(arr));int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum;}
}

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

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

相关文章

SAP 凭证分割功能 - 概述系统配置 - Chapter01/02

目录 1. 概述 2. 系统配置 2.1.为文档拆分给总分类账科目分类 2.2.对凭证拆分的凭证类型进行分类 2.3.定义总账会计核算的凭证分解特征 2.4.定义零余额结算科目 配置步骤: 路径:IMG->财务会计->总帐会计->业务交易->凭证拆分->定义零余额结算科 2.5.定义…

移动端uni-app小程序搜索高亮前端处理,同时可设置相关样式,兼顾性能

在uni-app中我们会遇到搜索高亮显示的需求 如下图&#xff1a; 起初用的是富文本实现 使用replaceAll方法取代搜索字段为一个 标签并设置相应的样式&#xff0c;但是小程序的并没有把 标签渲染出来&#xff0c;所以放弃了&#xff0c;下面原代码&#xff1a; /* 搜索字体变色…

C++进阶:详细讲解继承

现在也是结束了初阶部分的内容&#xff0c;今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼&#xff0c;立刻赶来“战场”的是进阶部分里的继承 文章目录 1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1继承的格式1.2.2再讲访问限定符(详讲protected)1.2.3**继承…

【被c++11弃用的智能指针auto_ptr】

C11标准之前的auto_ptr这个智能指针不被广泛使用的原因就是&#xff1a;在某些应用场景下&#xff0c;拷贝构造函数的意义不明确&#xff0c;同理赋值语句也是这个道理&#xff0c;意义同样不明确&#xff0c;因为C11标准之前并不存在移动赋值和移动构造的概念&#xff0c;还有…

NFT交易市场开发(一)

实现的基本功能 &#xff08;一&#xff09; 发行一个符合ERC20标准的测试Token&#xff0c;要求如下&#xff1a; 总量&#xff1a;&#xff1a;1亿精度&#xff1a;18名称&#xff1a;Fake USDT in CBI简称&#xff1a;cUSDT &#xff08;二&#xff09; 发行一个符合ERC72…

学习方法 学习态度

学习方法 弄清它的历史、局限性和本质 常用的:刻意练习、熟能生巧 不常用的:知道在哪里找就行 事有先后&#xff0c;物有次序&#xff0c;盖房屋必须从平地建起 学习态度 每天比前一天的自己进步一点点

数据结构——算法的空间复杂度

【本节内容】 1.空间复杂度 2.常见空间复杂度 1.空间复杂度 空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用额外存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算…

random标准模块

一、概述 在 Python 中&#xff0c;random 是一个内置模块&#xff0c;用于生成随机数。它提供了各种用于生成随机数的函数&#xff0c;包括伪随机数生成器、随机序列操作等。 1、需要导包 不会自动导入&#xff0c;需要显示的将random模块导入 import random2、源码分析&…

课时59:流程控制_if条件控制_语法解读

2.2.1 语法解读 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 条件结构能够根据某个特定的条件&#xff0c;结合内置的测试表达式功能&#xff0c;结合测试的结果状态值对于条件进行判断&#xff0c;然后选择执行合适的任务…

Android开发学习-内容共享ContentProvoder(server+client)

在应用之间共享数据 通过ContentProvider封装数据 ContentProvider使用的Uri语法结构如下&#xff1a; content://authority/data_path/id content&#xff1a;通用前缀&#xff0c;表示该uri用于ContentProvider定位资源 authority&#xff1a;是授权者名称&#xff0c;用…

【Greenhills】MULTIIDE集成第三方的编辑器进行源文件编辑工作

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 在使用GHS进行工作的时候&#xff0c;可以集成第三方的编辑器进行源文件编辑工作 2、 问题场景 用于解决在GHS中进行项目开发时&#xff0c;对于GHS的编辑器使用不习惯&#xff0c;想要切换到其他第三方的编辑…

基于c语言的大宗商品撮合交易平台的市场价值

大宗商品撮合交易平台的市场价值主要体现在以下几个方面&#xff1a; 提高市场流动性&#xff1a;平台通过自动化撮合和高效的交易处理&#xff0c;降低了交易成本&#xff0c;提高了市场流动性。这使得投资者能够更容易地找到合适的交易对手&#xff0c;促进交易的成交。 促进…

以题为例 浅谈sql注入布尔盲注

什么是布尔盲注 布尔盲注就是在注入过程中&#xff0c;页面只会返回false和true&#xff0c;不会去返回其它的信息&#xff0c;所以我们不能通过语句查询直接获得数据库的名字&#xff0c;而是通过逻辑获得数据库的信息 布尔盲注常使用函数 length() 返回字符串的长度&#…

TDengine 签约益和热力,应对智慧供热系统大规模数据挑战

近日&#xff0c;涛思数据与安阳益和热力集团有限公司达成合作协议&#xff0c;共同致力于推动智慧供热系统的建设和发展。作为安阳市城市集中供热的主要负责单位&#xff0c;益和热力将借助涛思数据先进的技术和解决方案&#xff0c;提升供热行业的管理效率和服务质量。在本次…

the demo for C# multicast delegate 多播委托

委托类Delegate&#xff0c;位于System命名空间下,是所有声明的委托类型的基类. 例如我们声明了一个委托类型Func<int,bool> MyFunc或者 delegate bool MyDel(int i); 该类型声明成功后&#xff0c;该委托类自动继承System.MulticastDelegate&#xff0c;其包含了构造…

为什么在镀膜时要测薄膜折射率?

在芯片制造中&#xff0c;镀膜工序&#xff08;PVD,CVD&#xff09;是必不可少的关键环节&#xff0c;薄膜的质量直接影响了芯片的性能。对这些薄膜的精细控制又离不开对其折射率的深入理解和精确测量。今天将对芯片制造中薄膜折射率的概念、测量方法&#xff0c;以及它在整个制…

Arcgis小技巧【19】——更改字段顺序

一、问题分析 一般情况下&#xff0c;一个合格且严谨的要素或表数据&#xff0c;它的字段顺序都是固定的。 比如三调数据&#xff0c;正常的字段数据如下&#xff08;截取部分字段&#xff09;&#xff1a; 数据经过处理&#xff0c;如增删字段&#xff0c;可能会出现字段顺序…

SAM模型

SAM与过去分割对比 根据以下Demo,我们可以发现&#xff0c;通过在图像中指定要分割的内容提示&#xff0c;SAM可以实现各种分割任务&#xff0c;且无需额外的训练、做到零样本泛化&#xff0c;即SAM学会了辨别物体、具备图像理解力、对不熟悉的图像和物体能进行零样本概括&…

Hyperf AOP 和 注解

注解 (hyperf.wiki) AOP 面向切面编程 (hyperf.wiki) 切面 定义切面(Aspect) 根据官方教程定义一个切面。可以指定类、方法、参数和注解上生效。 <?php namespace App\Aspect;use App\Service\SomeClass; use App\Annotation\SomeAnnotation; use Hyperf\Di\Annotatio…

论文阅读《FENET: FOCUSING ENHANCED NETWORK FOR LANE DETECTION》

ABSTRACT 受人类驾驶专注力的启发&#xff0c;这项研究开创性地利用聚焦采样&#xff08;Focusing Sampling&#xff09;、部分视野评估&#xff08;Partial Field of View Evaluation&#xff09;、增强型 FPN 架构和定向 IoU 损失&#xff08;Directional IoU Loss&#xff…