首页 > 其他分享 >斐波那契数列的多种实现和性能

斐波那契数列的多种实现和性能

时间:2023-01-15 16:13:53浏览次数:59  
标签:120 数列 程序运行 5358359254990966640871840 Seconds 斐波 int time 那契

目录

0. 普通斐波那契

import time
start = time.time()

def fib0(n: int) -> int:
    if n < 2:
        return n
    return fib0(n-1) + fib0(n-2)

print("fib0(40) = ", fib0(40))
end = time.time()
print('程序运行时间为: %s Seconds' % (end-start))

fib0(40) = 102334155
程序运行时间为: 29.292827367782593 Seconds

image

1. 结果缓存

每次计算任务完成后就把结果保存起来,这样在下次需要时即可直接检索出结果,而不需要一而再再而三地重复计算

from typing import Dict
import time
start = time.time()
memo: Dict[int, int] = {0: 0, 1: 1}

def fib1(n: int) -> int:
    if n not in memo:
        memo[n] = fib1(n-1) + fib1(n-2)
    return memo[n]

print("fib1(120) = ", fib1(120))
end = time.time()
print('程序运行时间为: %s Seconds' % (end-start))

fib1(120) = 5358359254990966640871840
程序运行时间为: 0.005672931671142578 Seconds
fib1(120) = 5358359254990966640871840
程序运行时间为: 0.00408172607421875 Seconds
fib1(120) = 5358359254990966640871840
程序运行时间为: 0.004380702972412109 Seconds

2. 自动化结果缓存

  • 每次用新的参数执行fib()时,该装饰器就会把返回值缓存起来。以后再用相同的参数调用fib()时,都会从缓存中读取该参数对应的fib()之前的返回值并返回
  • @lru_cache的maxsize属性表示对所装饰的函数最多应该缓存多少次最近的调用结果,如果将其设置为None就表示没有限制
    Cache replacement policies
    image
from functools import lru_cache
import time
start = time.time()

@lru_cache(maxsize=None)
def fib2(n: int) -> int:
    if n < 2:
        return n
    return fib2(n-1) + fib2(n-2)

print("fib2(120) = ", fib2(120))
end = time.time()
print('程序运行时间为: %s Seconds' % (end-start))

fib2(120) = 5358359254990966640871840
程序运行时间为: 6.771087646484375e-05 Seconds
fib2(120) = 5358359254990966640871840
程序运行时间为: 7.05718994140625e-05 Seconds
fib2(120) = 5358359254990966640871840
程序运行时间为: 7.677078247070312e-05 Seconds

3. 迭代

import time
start = time.time()

def fib3(n: int) -> int:
    if n == 0: return 0
    last: int = 0
    next: int = 1
    for _ in range(1, n):
        last, next = next, last+next
    return next

print("fib3(120) = ", fib3(120))
end = time.time()
print('程序运行时间为: %s Seconds' % (end-start))

fib3(120) = 5358359254990966640871840
程序运行时间为: 1.5020370483398438e-05 Seconds
fib3(120) = 5358359254990966640871840
程序运行时间为: 1.33514404296875e-05 Seconds
fib3(120) = 5358359254990966640871840
程序运行时间为: 1.430511474609375e-05 Seconds

4. 生成器

目前为止,已完成的这些函数都只能输出斐波那契序列中的单个值。如果要将到某个值之前的整个序列输出,又该怎么做呢?用yield语句很容易就能把fib5()转换为Python生成器。在对生成器进行迭代时,每轮迭代都会用yield语句从斐波那契序列中吐出一个值

from typing import Generator
import time
start = time.time()

def fib4(n: int) -> Generator[int, None, None]:
    yield 0
    if n > 0: yield 1
    last: int = 0
    next: int = 1
    for _ in range(1, n):
        last, next = next, last+next
        yield next

res = [_ for _ in fib4(120)]
print("fib4(120) = ", res[120])
end = time.time()
print('程序运行时间为: %s Seconds' % (end-start))

fib4(120) = 5358359254990966640871840
程序运行时间为: 0.004061222076416016 Seconds
fib4(120) = 5358359254990966640871840
程序运行时间为: 0.004450798034667969 Seconds
fib4(120) = 5358359254990966640871840
程序运行时间为: 0.004158735275268555 Seconds

标签:120,数列,程序运行,5358359254990966640871840,Seconds,斐波,int,time,那契
From: https://www.cnblogs.com/Knight02/p/fib.html

相关文章

  • 等差数列
    等差数列给定一个长度为$n$的正整数数列$a_1,a_2,\ldots,a_n$和一个正整数$k$。你可以对数列进行以下两种操作:+ix ,增加操作,将$a_i$的值增加$x$($x\geq1$)......
  • 栗酱的数列
    栗酱的数列关键差分处理,kmp查找代码#include<bits/stdc++.h>usingnamespacestd;constintM=2e5+5;inta[M],b[M];intc[M],d[M];intne[M];voidinit(in......
  • SQL Server 斐波那契数列
    斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现......
  • 数列分块:从入门到跑路——数列分块入门九题
    第一题区间加,单点询问首先讲讲数列分块是个啥。我们把数列分成一个个块,每个数属于块中的一部分。对于整块,我们有复杂度优秀的操作(一般是\(O(1)\)),对于散块,我们暴力......
  • 斐波那契数
    一、背景与定义      有这样一个数列1,1,2,3,5,8,13,21,34,55,89,144,……这个数列前两个数均为1,从第3项开始,每一项都等于前两项之和。        数列最早被提出是,......
  • 「贪心&优先队列」数列极差
    本题为12月30日22寒假集训每日一题题解题目来源:(未知)题面题目描述佳佳的老师在黑板上写了一个由n个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数a和......
  • java——等差素数数列
    题目描述2,3,5,7,11,13,.... 是素数序列。类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。上边的数列公差为 3030,长度为 ......
  • LOJ 数列分块入门 9 题解题报告
    LOJ数列分块入门9题解题报告\(\text{ByDaiRuiChen007}\)I.数列分块入门1题目大意\(\text{Link}\)维护一个长度为\(n\)的序列,支持区间加,单点查值思路分析简......
  • 509. 斐波那契数列
    问题描述https://leetcode.cn/problems/fibonacci-number/description/解题思路最经典的递归问题,它的问题描述就是递归的。先考虑参数和返回值。参数就是n,返回值是fib(......
  • 求第n个斐波那契数。(用递归和循环的方法对比)
    写这个代码的过程中出现的问题及改进方法:用递归实现#include<stdio.h>intFib(intn){if(n<=2)return1;elsereturnFib(n-1)+Fib(n-2);}......