斐波那契数列是学习算法的入门级算法,要对算法进行研究的话我们就必须的掌握斐波那契数列算法。以下从斐波那契数列的简介,递归算法和非递归算法给大家进行介绍。

  简介:

斐波那契数列(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. 斐波那契数列递归算法和非递归算法以及其时间复杂度分析

    1.在学习数据结构这门课的过程中,发现斐波那契数列的递归算法以及非递归算法,以及其时间复杂度分析是一个小难点.所以特别总结一下. 斐波那契数列的表达式: Fibonacci数列简介: F(1)=1 F ...

  2. 计算斐波那契数列递归算法和非递归算法的比较

    对于斐波那契数列的计算是计算机算法经典问题,常见的算法有递归算法和非递归算法两种,那么它们之间的不同应该如何对比? 本文用python为例,比较两种不同算法的时间复杂度等不同 代码比较 递归算法: # ...

  3. ----斐波那契数列---eval函数----类递归思想 栈 进出 思想

    ------------ 斐波那契 数列 --------------- [1,1,2,3,5,8,13,21,34,...] 1 列表方法实现 # l=[1,1] # # # while len(l ...

  4. [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]

    [问题描述][中等] 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N ...

  5. 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)

    话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...

  6. 递归法 最大公倍数 斐波那契数列 数组插入排序改递归

    辗转相除法: 例如:m%n=0;能够整除则n为最大公倍数 若m%n=k,不能够整除的话,继续辗转相除变为n%k 若n%k=c,不能整除的话继续这样- 核心代码 static int gcd(int m ...

  7. C++:斐波那契数列(迭代和递归)

    [问题引入] 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子 ...

  8. 斐波拉契数列的递推递归求解算法

    介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  9. 斐波那契数列递归算法与非递归算法

    斐波那契数列,又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列". 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, ...

  10. 斐波那契数列(Fibonacci)递归和非递归实现

    序列前9项为:0, 1, 1, 2, 3, 5, 8, 13, 21 要注意非递归的话就是那一个变量帮助存储当前下一项的值,然后依次挪动两个指针往下即可 注意如果n太大 会溢出  1     publ ...

最新文章

  1. UA MATH564 概率论V 中心极限定理
  2. SSH 本地和服务器传输
  3. mobileNet v2网络详解
  4. 关于英文邮件一些tips
  5. 《天天数学》连载50:二月十九日
  6. 使用Redis+java(模仿数据库)实现对象存取和读取
  7. “互联网+创新2.0”、“工业制造4.0战略”、“工业互联网
  8. java学习软件_刚学习java,用哪些学习软件比较好?
  9. 百度Apollo计划跟踪:Apollo 3.0前言
  10. 基于springboot的电影推荐网站管理系统
  11. C语言实现安全性极高的游戏存档并读档
  12. Spring MVC 详细信息讲解资料
  13. 世界上最著名的24句哲理
  14. SAP-ME mobile开发基础
  15. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
  16. 【总结】大学生寒假社会实践-社区志愿服务模板
  17. 2075最少拦截系统
  18. dell服务器安装(dellemc服务器)
  19. BZOJ 1085 骑士精神
  20. oracle--2.服务

热门文章

  1. mysql 查询正在进行的事务
  2. 2022茶艺师(中级)上岗证题库及答案
  3. 利用AirTest实现自动安装APK-跳过vivo手机安装验证
  4. keyshot怎么批量渲染_KeyShot轻松快速渲染教散效果
  5. 隐式Intent-打开浏览器
  6. Map集合,File类,IO流
  7. 关于MacBook Pro退出ID
  8. HTML使svg整体自适应网页变化、以元素颜色填充、隐藏显示
  9. 解决Zotero导入参考文献作者名字字母全部大写问题
  10. 深度学习入门极简教程(二)