题目描述:

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2)
给定 N,计算 F(N)。(0<=N<=30)
LeetCode-509

解题思路:

我们需要求F(N),则只需求F(N-1)和F(N-2),然后相加;而要知道F(N-1)就需要知道F(N-2)和F(N-3)的值,以此类推,知道F(0) = 0,F(1) = 1

1.递归思路

根据上面的分析,我们就可以递归的思路,逐层求解。
·明确递归出口:当n == 0 || n == 1时,return n
·每次调用函数本身去求解f(n-1),f(n-2)
代码示例(C语言):

int fib(int N) {if(N == 0 || N == 1)//递归出口return N;elsereturn fib(N-1) + fib(N-2);
}

递归程序是非常简洁的,但程序在运行时,会调用栈,是十分耗时的;这样我们就像着可以使用辅助空间来存储f(n)的值,直接使用,从而节省时间。

2.使用辅助数组

因为N的取值范围是比较小的,所以我们可以使用大小为31的数组(0~30,即31个值):

int fib(int N) {if(N == 0 || N == 1)return N;int i = 2;int fboArray[31] = {0};fboArray[0] = 0;fboArray[1] = 1;while(i <= N){fboArray[i] = fboArray[i-1] + fboArray[i-2];i++;}return fboArray[i-1];
}

我们可以看到,这种方法的空间复杂度是O(n),但我们在计算时会发现:我们计算f(n)的值,只需要知道f(n-1)和f(n-2)的值,那么我们只需要不断更新记下前两个值,就可以了。
那么就可以做下面的优化:

int fib(int N) {if(N == 0 || N == 1)return N;int pre2 = 0;int pre1 = 1;int cur = 1;int i = 2;while(i++ <= N){cur = pre1 + pre2;pre2 = pre1;pre1 = cur;}return cur;
}

时间复杂度为O(1)

(不足之处还望指正,谢谢)

斐波拉契数列(简单思路)相关推荐

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

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

  2. c语言n次方怎么输入_C语言实现斐波拉契数列

    C语言实现斐波拉契数列教程 怎么使用 C 语言实现计算斐波拉契数列的第 N 项的值? C语言实现斐波拉契数列详解 背景知识 斐波那契数列是一组第一位和第二位为 1,从第三位开始,后一位是前两位和的一组 ...

  3. C案例:打印斐波拉契数列

    C案例:打印斐波拉契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)= ...

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

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

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

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

  6. python斐波拉契数列/素数数列

    一.斐波拉契数列 著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到: 1, 1, 2, 3, 5, 8, 13, 21, 34, - def fib(n ...

  7. Python输入整数n,求斐波拉契数列第n个数

    递归方法: # 输入整数n,求斐波拉契数列第n个数. # 思路: # 递归式算法: # 利用f(n) = f(n-1) + f(n-2)的特性来进行递归def fn(n):if n==0:return ...

  8. Python 探讨斐波拉契数列模素数的周期问题

    Python 探讨斐波拉契数列模素数的周期问题之目录 前言 一.生成斐波拉契数列 二.创建素数列表 三.搜索周期数列的循环节 3.1 斐波拉契数列模 p p p 的周期 3.2 循环节的搜寻代码 3. ...

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

  10. 函数-生成器之斐波拉契数列

    斐波拉契数列:除第一个和第二个数外,任意一个数都可以由前两个数相加而来. 无法用生成式,但可由函数生成. 函数生成斐波拉契数列数列: def fib(max):n,a,b=0,0,1while n & ...

最新文章

  1. Interesting visualization tools for profiling.
  2. 如何进行网络推广教大家在网站排名变差该如何进行查找问题所在?
  3. react router 级联路由_前端路由原理解析和实现
  4. 会计记忆总结之九:会计档案
  5. linux服务器没网情况下手动安装软件几个方法
  6. matlab 曲线拟合求导,基于matlab曲线拟合的数据预测分析
  7. mysql 允许用户远程_Mysql 允许用户远程操作
  8. miniUI mini-monthpicker ie8兼容性问题
  9. 安装Caffe报错:/usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7 is not a symbolic link
  10. 递归和循环两种方式求解连续数的相加
  11. 万能数据库查询分析器 5.05发布,本人为之撰写的相关技术文章达65篇
  12. 统计学习——联合概率分布
  13. 解决导入protobuf源代码Unity报错的问题
  14. electron设置淘宝镜像
  15. 某型车载导航软件测试
  16. 奇数点偶数点fft的matlab,电子科大 数字信号处理实验2_FFT的实现
  17. 蚂蚁养鸡线下支付扫码链接
  18. 《电工学》课程教学大纲- -
  19. 时隔3年,再次折腾BlackBerry 8830!
  20. Linux系统配置虚拟IP

热门文章

  1. vector<vector>排序
  2. 用累积分布函数(CDF)计算期望
  3. 【安卓学习之常见问题】 使用Eclipse clean时,出现“cleaning all project has encountered a problem”提示
  4. 独孤思维:没有复盘的项目,不会赚钱
  5. Slf4j MDC机制
  6. 基于S-Function的Joystick Input
  7. Ubuntu安装系统
  8. LWIP+ENC28J60长时间运行后无法访问外网服务器
  9. Win32程序设计初步之线程
  10. 8点1氪|苹果第一财季营收843亿美元;VIPKID拟融资4-5亿美元;工信部称5G终端将于年中推出...