[剑指offer] 7. 斐波那契数列 (递归 时间复杂度)

简介:

杨辉三角每条斜线上的数之和就构成斐波那契数列。

思路:
参考文章:https://mp.weixin.qq.com/s?src=11×tamp=1551321876&ver=1455&signature=ahEqF*AhQMM5L8e-JCqIGUm6vZ8dQHWSX70P-j-tWtN2gQYpHJSB61cItv2h5Sy-DE0E5grEEVTQikdpIT9tC34u5qLh-mvM*PhBuE3S6nU32*9k1NmkS3krk0YVxRpM&new=1
1.递归法
class Solution:
def Fibonacci(self, n):
# write code here
if n <= 1:
return n
while n >= 2:
return self.Fibonacci(n-1)+self.Fibonacci(n-2)
f(a)会重复计算,这就是递归的最大问题,对于同一个f(a),不能复用。这样直接求解,时间复杂度是指数级的,不可行;
2.正推法
上述方法是采用反向推导,假设要求f(5), 则f(5)=f(4)+f(3); 而f(4)=f(3)+f(2),f(3)=f(2)+f(1);.......一路递归下去,最终都将递归到f(0)和f(1)上来。反过来想,我们不倒着f(n),f(n-1),f(n-2)这么计算,而是f(0),f(1),f(2)…f(n)这么正向计算,岂不是更快么?这么正向的计算,只需要一个for循环,就能够计算出f(n)的值,时间复杂度是O(n)。
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.array=[0]*40 #数组定义,初始化
def Fibonacci(self, n):
# write code here
self.array[0]=0
self.array[1]=1
for i in range(2,n+1): #直接遍历所有
self.array[i]=self.array[i-1]+self.array[i-2]
return self.array[n]
关于数组定义:
- 一维数组:a1 = [0]*10; a2 = range(10);a3 = [0 for x in range(0, 10)]
- 二维数组:a = [ [ random.random() for x in range(10) ] for y in range(5)] #5行10列]; b=[ [ 0 ]*10 ] * 5
在一维数组中,上述几种方式没有区别。
但是在二维数组中,a[0][0]=1时,只有a[0][0]为1,其他全为0。b[0][0]=1时,b[0][0],b[1][0]...直到b[4,0]全部为1。由此得到二维数组中,若采用b这种定义,每一列数据将全是一个相同的引用,即指向同一地址。故 b = [[0]*10]*5并不符合我们常规意义上的二维数组。
此外还要多种求解方式,复杂度从指数级到O(n) 到 O(lgn) 到 O(1)均有,具体可读参考文章。
[剑指offer] 7. 斐波那契数列 (递归 时间复杂度)的更多相关文章
- 《剑指offer》斐波那契数列
本题来自<剑指offer> 斐波那契数列 矩阵覆盖 题目一: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 思路: ...
- 剑指offer:斐波那契数列
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...
- 力扣 - 剑指 Offer 10- I. 斐波那契数列
题目 剑指 Offer 10- I. 斐波那契数列 思路1(递归 / 自顶向下) 这题是很常见的一道入门递归题,可以采用自顶向下的递归方法,比如我们要求第n个位置的值,根据斐波那契数列的定义fib(n ...
- 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...
- Go语言实现:【剑指offer】斐波那契数列
该题目来源于牛客网<剑指offer>专题. 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) n<=39 Go语言实现: 递归: ...
- 剑指offer三: 斐波拉契数列
斐波拉契数列是指这样一个数列: F(1)=1; F(2)=1; F(n)=F(n-1)+F(n); public class Solution { public int Fibonacci(int n ...
- 剑指Offer 7. 斐波那契数列 (递归)
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题目地址 https://www.nowcoder.com/prac ...
- 《剑指offer》-斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 这么直接的问fibonacci,显然是迭代计算.递归的问题在于重复计算,而迭代则避免了这一点:递归是自 ...
- 【剑指offer】斐波那契数列
一.题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 二.思路: 式子: n=0时,f=0:n=1或者n=2时f=1:否则f=f(n-1)+f(n ...
随机推荐
- 可执行程序无法在Linux上运行,显示line 1: syntax error: word unexpected (expecting ") .
[问题]用arm-linux-gcc编译出来的可执行文件clkCtl,下载到板子上,在Linux下不能运行:./clkCtl: line 1: syntax error: word unexpecte ...
- TOMCAT-IDEA远程debug方法
在很多情况下,tomcat本地启动并不足以完全模拟线上环境,所以,有时候我们可能需要远程debug方法去调试,下面附上远程idea debug方法: IDEA中,选择 Run/Debug Config ...
- ASP.NET--Razor-model-compare属性用法
学习使用model中的compare属性来判断两个密码之间是否相同 [Required] [StringLength(100, ErrorMessage = "The {0} must be ...
- openwrt针对RT5350代码下载,配置和编译
转载地址:http://blog.csdn.net/dean_gdp/article/details/37091685 近期买了块官方板的RT5350: 先介绍代码下载.下面命令都是用登录用户运行,无 ...
- Visual studio 编译时copy文件、文件夹
项目属性--生成事件 添加命令 xcopy /y /d "$(SolutionDir)Dll\Linphone\*.dll" "$(TargetDir)\Linphone ...
- Ubuntu14.04下Mongodb的Java API编程实例(手动项目或者maven项目)
不多说,直接上干货! 若大家,不会安装的话,则请移步,随便挑选一种. Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐) Ubuntu14.04 ...
- 视图 Model转集合
@{ Layout = null;}@using MvcApplication2.Models <!DOCTYPE html> <html><head> ...
- Chosen:Select 选择框的华丽变身
HTML Form 表单里的各种组件,例如文本输入框,textarea,按钮等,都可以通过CSS或其它技术进行美化,让它们看起来很漂亮了,唯独下拉列表选项框(select box),不管你怎么做,它摆 ...
- c# CacheHelper缓存帮助类
一.开篇 主要功能:改善程序性能.服务器的响应速度,尤其是当数据的处理过程变得复杂以及访问量变大时,变得比较明显.有些数据并非时刻在发生变化,如果我们可以将一些变化不频繁的数据的最终计算结果(包括页面 ...
- ValueProvider核心的值提供系统
Model绑定的数据具有多种来源: 提交的表单 Json字符串 当前路由数据 请求地址的查询字符串 ASP.NET MVC将这种基于不同数据来源的数据提供机制实现在ValueProvider的组件中 ...