斐波那契数列递归与非递归精讲
斐波那契数列是学习算法的入门级算法,要对算法进行研究的话我们就必须的掌握斐波那契数列算法。以下从斐波那契数列的简介,递归算法和非递归算法给大家进行介绍。
简介:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。(百度百科)
递归算法:
什么是递归算法?我将递归算法理解为一个函数的重复调用。F(n)=F(n-1)+F(n-2)。那么重复调用的函数就是F(x)(x可以是任意的正整数)。这个公式的意思是F(n)的值等于其F(n-1)的值加上F(n-2)的值。假如我们求n=3的值,就是F(3)=F(2)+F(1)。由于F(2)=1,F(1)=1,这两个就是我们要找的结束条件。
递归算法的两个必要的条件:1.循环的部分。2.结束条件。我们已经找到这两个条件了,那么我们来编写代码。
int F(int n)//递归
{if (n == 1){return 0;}if (n == 2){return 1;}return F(n - 1) + F(n - 2);
}
递归算法的时间复杂度是O(2^n)。别去深究记住就行,反正我是看了半天都看不明白。
非递归算法:
由于递归算法的时间复杂度非常的高,并且在其中还有许多重复的计算,如图所示:
可以看到如果使用递归的方法来计算的话F(4)执行了1次,F(3)执行了2次,F(2)执行了3次,F(1)执行了2次。本来只需要每一个进行一次运算的可是却重复计算了很多。当n很大的时候就会使执行的速度变得很慢。
再来看看原来的式子:F(n)=F(n-1)+F(n-2),F(3)=F(2)+F(1),F(4)=F(3)+F(2)可以发现。要求的那一项等于其前两项之和。根据这个规则,运用for循环就能解决了。
int F(int n)
{if (n == 1){return 0;}if (n == 2){return 1;}int f1 = 0;int f2 = 1;int c = 0;for (int i = 3; i <= n; i++){c = f1 + f2;f1 = f2;f2 = c;}return c;
}
我们要求n=5的时候,那么就肯定得求出n=3,n=4的值。当要求n=6的时候肯定要求出n=5,n=4的值,n=5的值就必然要求n=3的值。因此我们求n的值时,就必然要求n=3的值,当要求n=3的值的时候,就必然要求n=2,n=1的值。
这就是非递归的思想,从低的值往高的值求。算法的时间复杂度O(n)。
当i=3时,c就是F(3)的值,当i=4时,c就是F(4)的值。如果不懂的话,仔细的分析代码,你绝对能够发现其中的奥秘的。
斐波那契数列递归与非递归精讲相关推荐
- 斐波那契数列递归算法和非递归算法以及其时间复杂度分析
1.在学习数据结构这门课的过程中,发现斐波那契数列的递归算法以及非递归算法,以及其时间复杂度分析是一个小难点.所以特别总结一下. 斐波那契数列的表达式: Fibonacci数列简介: F(1)=1 F ...
- 计算斐波那契数列递归算法和非递归算法的比较
对于斐波那契数列的计算是计算机算法经典问题,常见的算法有递归算法和非递归算法两种,那么它们之间的不同应该如何对比? 本文用python为例,比较两种不同算法的时间复杂度等不同 代码比较 递归算法: # ...
- ----斐波那契数列---eval函数----类递归思想 栈 进出 思想
------------ 斐波那契 数列 --------------- [1,1,2,3,5,8,13,21,34,...] 1 列表方法实现 # l=[1,1] # # # while len(l ...
- [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]
[问题描述][中等] 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N ...
- 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)
话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...
- 递归法 最大公倍数 斐波那契数列 数组插入排序改递归
辗转相除法: 例如:m%n=0;能够整除则n为最大公倍数 若m%n=k,不能够整除的话,继续辗转相除变为n%k 若n%k=c,不能整除的话继续这样- 核心代码 static int gcd(int m ...
- C++:斐波那契数列(迭代和递归)
[问题引入] 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子 ...
- 斐波拉契数列的递推递归求解算法
介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- 斐波那契数列递归算法与非递归算法
斐波那契数列,又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列". 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, ...
- 斐波那契数列(Fibonacci)递归和非递归实现
序列前9项为:0, 1, 1, 2, 3, 5, 8, 13, 21 要注意非递归的话就是那一个变量帮助存储当前下一项的值,然后依次挪动两个指针往下即可 注意如果n太大 会溢出 1 publ ...
最新文章
- UA MATH564 概率论V 中心极限定理
- SSH 本地和服务器传输
- mobileNet v2网络详解
- 关于英文邮件一些tips
- 《天天数学》连载50:二月十九日
- 使用Redis+java(模仿数据库)实现对象存取和读取
- “互联网+创新2.0”、“工业制造4.0战略”、“工业互联网
- java学习软件_刚学习java,用哪些学习软件比较好?
- 百度Apollo计划跟踪:Apollo 3.0前言
- 基于springboot的电影推荐网站管理系统
- C语言实现安全性极高的游戏存档并读档
- Spring MVC 详细信息讲解资料
- 世界上最著名的24句哲理
- SAP-ME mobile开发基础
- Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
- 【总结】大学生寒假社会实践-社区志愿服务模板
- 2075最少拦截系统
- dell服务器安装(dellemc服务器)
- BZOJ 1085 骑士精神
- oracle--2.服务