3.斐波那契数列的高效方法

斐波那契数列的递归方法众所周知,但是递归也不是一个高效的解决方法。

从下边的调用图可以看出来:

其中,对于1和2的计算重复了多次。

因此如果对数列中已经计算过的数字进行存储这样就可以只计算一次每个数值,达到高效的目的,计算时间也相对减少了。

1 known = {0:0,1:1}
2
3 def fibonacci(n):
4     if n in known:
5         return known[n]
6
7     res = fibonacci(n-1)+fibonacci(n-2)
8     known[n] = res
9     return res

代码如上,把计算过的数值添加到一个字典里,就可以避免重复计算。

注:字典的值可以使用列表,但是键不可以。但是为了解决这个问题,键是可以使用元组的,以后遇到再解释。

时间: 2024-08-05 12:30:03

3.斐波那契数列的高效方法的相关文章

斐波那契数列多种实现方法

#include "iostream" #include "queue" #include "cmath" using namespace std; int fib1(int index) //递归实现 { if(index<1) { return -1; } if(index==1 || index==2) return 1; return fib1(index-1)+fib1(index-2); } int fib2(int index

斐波拉契数列、楼梯问题、奶牛问题

斐波拉契数列:波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)[from 百度百科 http://baike.baidu.com/link?url=8LKtKTAllUGDMe610zIO0DAjS3CCeAOpXiCFvH_Y47_I_XDRgzyGcrzsodd1OHO726FJNPWkqzkQC7PIuGu_

斐波那契数列的$O(\logN)$求法

欢迎来访 介绍求斐波那契数列时间复杂度为\(O(\log N)\)的做法之前,我们先看一下快速幂. 快速幂 题目链接 快速幂是数论中非常基础的算法. 当我们要求\(a^b mod p, (1 \le a, b, p \le 10^9)\)时,如果是朴素做法,时间复杂度为\(O(N)\)显然会超时,而快速幂能够做到的是将时间复杂度降到\(O(\log b)\). 做法 首先预处理出:\(a^{2^0}, a^{2^1}, a^{2^2}, a^{2^3}, ..., , a^{2^{\log b}

斐波那契数列高效递归求法

时间:2014.05.19 地点:图书馆 ------------------------------------------------------------------- 一.简述 前面给出了一种斐波那契数列解法的矩阵幂方法,这是最高效的方法,时间复杂度为O(log).正常来说通过递推公式 F(n)=F(n-1)+F(n-2)直接来计算F(n)效率是很差的,因为这里会涉及很多冗余计算,比如求F(5),我们要求[F(4)和F(3)],[要求F(4)则得求F(3)和F(2),要求F(3)得求F

斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n).第一个斐波拉契数为F(0) = 1. 给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007. 斐波拉契数列的计算是一个非常经典的问题,对于小规模的n,很容易用递归的方式来获取,对于稍微大一点的n,为

求斐波那契数列的第n项值——9

写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 0            n = 0 F(n) =  1            n = 1 F(n-1)+F(n-2)    n > 1 也就是斐波那契数列为{0,1,1,2,3,5,8,13,21,......F(n-1)+F(n-2)}: 首先可以想到,因为要求第n个斐波那契数,就需要知道第n-1和第n-2个斐波那契数,而求第n-1个斐波那契数就需要知道第n-2个和第n-3个斐波那契数,第n-2个斐波

js斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89...... 这个数列从第3项开始,每一项都等于前两项之和. 1.递归算法: function fib(n) { if (n < 2) { return n; }else { return fib(n-1) + fib(n-2); } } 2.动态规划算法 function fib(n) { var val = []; for (var i = 0; i <= n; ++i) { val[i

还在用递归实现斐波那契数列,面试官一定会鄙视你到死

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...... 我记得在初学C语言的时候,大学老师经常会讲一些常见的数学问题及递归的使用,其中斐波那契数列就是一定会被拿出来举例的.在后来工作中,面试做面试题的时候,也很大概率会出现编写算法实现斐波那契额数列求值.可以说,在我们编程道路上,编写算法实现斐波那契数列是

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3