zoukankan      html  css  js  c++  java
  • 斐波那契数列的各种实现方式

    ---------------------斐波那契数列
    # no1 最初始的版本 使用for循环完成,交换
    def fib(n):
        a = 0
        b = 1
        for i in range(n):
            a, b = b, a + b
        return a
    print(fib(3)) # 2
    
    # no2.1 使用递归完成,但是这个版本的 递归效率极低,通过 ipython的jupyter 的%%timeit测试, 还不如循环。因为return的fib(n-1)+fib(n-2),d都要分别往下继续执行,数据量大的时候,这个相当于重复了很多,前面算了的,后面fib(n-2)里还要算一次,所以效率极低。
    def fib(n):
        if n < 3:
            return 1
        return fib(n-1) + fib(n-2)
    
    print(fib(3)) # 2
    
    # no2.2 变形版本:
    def fib(n):
        return 1 if n < 3 else fib(n-1) + fib(n-2)
    
    print(fib(3)) # 2
    
    # no 3 利用上次的结果的递归
    # 这里使用 缺省参数作为运算结果,而n 作为循环次数控制量
    def fib(n, a=0, b=1):               def fib(n, a=0, b=1):                   def fib(n, a=0, b=1):
        if n == 0:                          if n == 0:                               if n == 0:
            return a                             return a                               return a
        a, b = b, a + b                     a, b = b, a + b                           a, b = b, a + b
        return fib(n-1, a, b)              return fib(n-1, a, b)                     return fib(n-1, a, b)
    
    print((fib(3)))
    
    # no4 利用生成器实现
    def fib():
        x = 0
        y = 1
        while True:
            yield y
            x, y = y, x + y
    foo = fib()
    for _ in range(5):
        print(next(foo))
    
    # no5 利用 实例调用实现
    class Fib:
        def __init__(self):
            self.items = [0, 1, 1]
    
        def __call__(self, index):
            if index >= len(self.items):
                for i in range(3, index + 1):
                    self.items.append(self.items[i-1] + self.items[i-2])
            return self.items[index]
    
        def __iter__(self):
            yield  from self.items
    
        def __len__(self):
            return len(self.items)
    
        def __getitem__(self, item):
            return self.items[item]
    
        def __str__(self):
            return str(self.items)
    
    
    
    f = Fib()
    print(f(10))
    print(f.items)
    print(f(4))
    print(f[4])
    print(f.items)
    print(len(f))
    1 # no 7 利用缓存的递归版本
    2 from functools import lru_cache
    3 
    4 @lru_cache()
    5 def fib(n):
    6     if n < 3:
    7         return 1
    8     return fib(n-1) + fib(n-2)
    9 print(fib(40))
    为什么要坚持,想一想当初!
  • 相关阅读:
    OpenCV学习笔记(一)
    scrapy学习笔记一
    Mac上使用selenium自动运行chrome
    【js Utils】web前端工具帮助类kikyoUtils
    【jq 分享】伪微信分享
    【Winform 动图】winform窗体显示动图
    【 Base<T> 】IBaseDao 和 IBaseService 通用 基类 实现
    【js 是否手机】JavaScript判读当前是否是手机端
    【Spring helper】在controller和service间添加业务处理helper类
    【 spring resources 】maven项目resources文件夹,配置文件的spring加载方式
  • 原文地址:https://www.cnblogs.com/JerryZao/p/9683073.html
Copyright © 2011-2022 走看看