斐波那契数列的背景及解决方法
斐波那契数列的背景及解决方法
背景:
前两天看到一道很有意思的数学题
假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?
首先,在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底,最老的雌兔产下第三对兔子,两个月前生的雌兔产下一对兔子,共有5对兔子;……如此这般计算下去,兔子对数分别是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, …看出规律了吗?从第3个数目开始,每个数目都是前面两个数目之和。这就是著名的斐波那契(Fibonacci)数列。
表示如图:
月份 | 兔子数量/对 |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 3 |
5 | 5 |
6 | 8 |
在这里我们可以看出斐波那契数列的规律,即从第三项开始,每项的值等于它前两项值得和,用数学表达式来表示就是:
Fibonacci数列的数学表达式就是:
F(1) = 1
F(2) = 1
F(3) = F(1) + F(2)
F(4) = F(2) + F(3)
…
F(n) = F(n-1) + F(n-2)
最简单的方法,使用递归,但是慎用!!!
javapublic static int test3(int n) {if (n == 1 || n == 2) {return 1;}else {return test3(n-1) + test3(n-2);}}
可以看出,递归的优点是结构简单,但是缺点也很明显,那就是运算量太大,数据量小还可以,数据一大容易GG
所以,博主推荐使用下面循环的方法
递推方法(循环):
javaint a = 1, b=1, c = 0;for (int i = 1; i <= n; i++) {if (i == 1) {System.out.println("第" + i + "等于" + a);}else if (i == 2) {System.out.println("第" + i + "等于" + b);}else {c = a+b;a = b;b = c;System.out.println("第" + i + "等于" + c);}}
这种循环的方式是通过给变量不断赋值,来实现结果,运算的时间复杂度要远小于递归方式。
递推方法-数组方式(循环)
java
int[] arrayList = new int[n];arrayList[0] = arrayList[1] =1;for (int i = 0; i < arrayList.length; i++) {if (i == 0) {System.out.println("第" + (i+1) + "等于" + arrayList[0]);}else if (i == 1) {System.out.println("第" + (i+1) + "等于" + arrayList[1]);}else {arrayList[i] = arrayList[i-1] +arrayList[i-2];System.out.println("第" + (i+1) + "等于" + arrayList[i]);}}
利用数组进行存储,把每项的计算结果都存放在数组当中,需要时直接从数组中进行存取,空间复杂度和时间复杂度都比较低。
下面放上几组网络图片,带大家更深入了解斐波那契数列
1.黄金分割
随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887……
2.矩形面积
斐波那契数列与矩形面积的生成相关,由此可以导出一个斐波那契数列的一个性质。斐波那契数列前几项的平方和可以看做不同大小的正方形,由于斐波那契的递推公式,它们可以拼成一个大的矩形。这样所有小正方形的面积之和等于大矩形的面积。则可以得到如下的恒等式:
F1²+F2²+…+Fn² = Fn * F(n+1)²
用途
斐波那契数列中的斐波那契数会经常出现在我们的眼前——比如松果、凤梨、树叶的排列、某些花朵的花瓣数(典型的有向日葵花瓣),蜂巢,蜻蜓翅膀,超越数e(可以推出更多),黄金矩形、黄金分割、等角螺线,十二平均律等
以上所述为总结资料自己理解,如有任何问题请联系作者。新人报道,欢迎大佬们指正(peng peng peng)
斐波那契数列的背景及解决方法相关推荐
- 斐波拉契数列的三种实现方法
百度解释 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子 ...
- 斐波那契数列O(logn)的求解方法
前言 是的,没错,斐波那契数列除了递推.递归算法之外,还有更加高效的求解方法,那就是矩阵运算+快速幂. 思路: 可以先利用矩阵运算的性质将通项公式变成幂次形式,然后用平方倍增(快速幂)的方法求解第 n ...
- 斐波那契数列通项公式的几种方法
1.递归 2.动态规划 3.矩阵快速幂 转载于:https://www.cnblogs.com/umrx/p/8145954.html
- 面试题9:斐波那契数列
题目1:写一个函数,输入n,其斐波那契数列的第n项. 斐波那契数列的定义如下: 方法1:使用递归解,时间复杂度是n的指数级别 斐波那契数列的定义就是递归的,我们根据定义可以很简单的写出代码.代码如下: ...
- 波菲那契数列公式_斐波那契数列为什么那么重要,所有关于数学的书几乎都会提到?...
一句话先回答问题:因为斐波那契数列在数学和生活以及自然界中都非常有用. 下面我就尽我所能,讲述一下斐波那契数列. 一.起源和定义 斐波那契数列最早被提出是印度数学家Gopala,他在研究箱子包装物件长 ...
- Python3实现斐波那契数列.md
Python3实现斐波那契数列 一.Python3迭代方法实现斐波那契数列 二.Python3递归方法实现斐波那契数列 三.总结规律 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, ...
- Python - Python3 编程第一步 Fibonacci series: 斐波纳契数列
Fibonacci series: 斐波纳契数列, 两个元素的总和确定了下一个数,例如:1 1 2 3 5 8 13 21 34 55 Python程序如下: def fibonacci1(n):a, ...
- 笔试题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。该题有三种解法:递归的方法求解斐波那契数列、用概率与统计的数学方法解决,3.动态规划
笔试题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法.该题有三种解法:1.递归的方法求解斐波那契数列.2.用概率与统计的数学方法解决,3.动态规划 ...
- 斐波那契数列(C/C++)
目录 背景介绍 解法1:非数组+非递归 解法2:数组+非递归 解法3:非数组+递归 解法4:数组+递归 背景介绍 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13. ...
最新文章
- 王道考研 计算机网络笔记 第四章:网络层
- JDK源码分析-Integer
- python循环中append_[Python]list.append()在for循环中每次添加的都是最后的一个元素
- webpack打包---报错内存溢出javaScript heap out of memory
- osgi:install_OSGi服务测试助手:ServiceRegistrationRule
- Spring源码解析-实例化bean对象
- python web开发,organization的model设计
- 武德 | 年轻人!这才叫真正的程序猿的武德
- 机器学习(7)——Logistic回归(从疝气病症预测病马的死亡率)
- 数据库中数据数据初始化的好处
- 旧物回收类网站源码v2.4
- 母亲节微信公众号走心文章就用来逗编辑器排版
- matlab 均匀设计编程,均匀设计均匀设计表--方开泰.doc
- 连接池原理解读,各个连接池对比
- 10大习惯让你变年轻
- 2018-3-4——st(快速幂)
- PNP三极管和NPN三极管的开关电路(EC极性接线判断简单明了)简单的技巧:三极管上箭头所在方向的二极管,只要二极管正向导通,那么三极管上下就能导通。
- 公式不懂也无妨,业务精通才是真正的算法工程师
- 无线破解攻击工具使用详解
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解