简介:

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

思路:

参考文章:https://mp.weixin.qq.com/s?src=11&timestamp=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. 斐波那契数列 (递归 时间复杂度)的更多相关文章

  1. 《剑指offer》斐波那契数列

    本题来自<剑指offer> 斐波那契数列 矩阵覆盖 题目一: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 思路: ...

  2. 剑指offer:斐波那契数列

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...

  3. 力扣 - 剑指 Offer 10- I. 斐波那契数列

    题目 剑指 Offer 10- I. 斐波那契数列 思路1(递归 / 自顶向下) 这题是很常见的一道入门递归题,可以采用自顶向下的递归方法,比如我们要求第n个位置的值,根据斐波那契数列的定义fib(n ...

  4. 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题

     本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...

  5. Go语言实现:【剑指offer】斐波那契数列

    该题目来源于牛客网<剑指offer>专题. 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) n<=39 Go语言实现: 递归: ...

  6. 剑指offer三: 斐波拉契数列

    斐波拉契数列是指这样一个数列: F(1)=1; F(2)=1; F(n)=F(n-1)+F(n); public class Solution { public int Fibonacci(int n ...

  7. 剑指Offer 7. 斐波那契数列 (递归)

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题目地址 https://www.nowcoder.com/prac ...

  8. 《剑指offer》-斐波那契数列

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 这么直接的问fibonacci,显然是迭代计算.递归的问题在于重复计算,而迭代则避免了这一点:递归是自 ...

  9. 【剑指offer】斐波那契数列

    一.题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 二.思路: 式子: n=0时,f=0:n=1或者n=2时f=1:否则f=f(n-1)+f(n ...

随机推荐

  1. django与mysql实现简单的增删查改

    模型定义 from django.db import models class Grades(models.Model): g_name = models.CharField(max_length=2 ...

  2. Python全双工聊天

    全双工聊天 全双工聊天:服务端和客户端都可以发送并接收信息. 使用select模块中的select方法 select(rlist, wlist, xlist[, timeout]) -> (rl ...

  3. php循环练习题

    1.通过for循环将数组中值求和.求平均值 <?php $num=[1,2,3,4,5,6,7,8,9]; $sum = 0; for ($i=0,$n=count($num); $i < ...

  4. ARP(地址解析协议)

    目录 1. ARP 概述 2. ARP 协议工作原理 3. ARP 缓存 4. ARP 报文格式 5. 抓包分析 5.1. ARP 请求报文 5.2. ARP 应答报文 6. 免费 ARP 7. AR ...

  5. ie6 bug 收集

    1.IE6中奇数宽高的BUG IE6下查看,变成了right:1px的效果了: IE6还有奇数宽高的bug,解决方案就是将外部相对定位的div宽度改成偶数.高度也是一样的查看源码: CSS代码: #o ...

  6. SQLPlus在连接时通常有四种方式

    SQLPlus在连接时通常有四种方式 1. ? 1 sqlplus / as sysdba 操作系统认证,不需要数据库服务器启动listener,也不需要数据库服务器处于可用状态.比如我们想要启动数据 ...

  7. iOS 使用脚本自动化复制target

    有些项目成熟以后,就会有需求自动化配置生成一个全新的项目,不需要再让开发人员手动修改工程文件,将配置化工作直接移交给运维或者配置团队去做 其实按照普通的做法,无非就是在xcode里将目标target ...

  8. 树莓派 rtl8188eu 芯片wifi驱动

    总算是找到了.现拿出来分享.參考地址:https://www.raspberrypi.org/forums/viewtopic.php? p=462982#p462982 下载的地址是:https:/ ...

  9. 具体图解 Flume介绍、安装配置

    写在前面一: 本文总结"Hadoop生态系统"中的当中一员--Apache Flume 写在前面二: 所用软件说明: 一.什么是Apache Flume 官网:Flume is a ...

  10. python中数字的排序

    lst = [2,22,4,7,18]for j in range(len(lst)): #记录内部排序的次数 i = 0 while i < len(lst)-1: if lst[i] > ...