python3 多种方式计算斐波那契数列
2018-08-22 本文已影响0人
余带盐
def fibonacci1(n: int) -> []: """ 这个是使用 a,b=b,a 的技术求斐波那契数列 :param n: n是斐波那契数列的序号 :return: 以key为序号,以val为值的斐波那契数列的字典 """ while n < 1: n = int(input("请输入正整数:")) dict1 = {} if n == 1: dict1[0] = 1 else: a = 0 b = 1 for i in range(1, n + 1): dict1[i] = b a, b = b, a + b print(dict1.values()) return dict1 def fibonacci2(n: int, dict1: {} = {}) -> {}: """ 通过迭代+闭包的方式求斐波那契数列 :param n: 序号 :param dict1: 使用这个可以在多次斐波那契数列的计算中节省次数,要么不填,要么默认为{} :return: 以key为序号,以val为值的斐波那契数列的字典 """ # 下面这句代码是根据把空dict1生成 {0: 0, 1: 1} if len(dict1) < 2: dict1.clear() dict1[0] = 0 dict1[1] = 1 while n < 1: n = int(input("请输入正整数:")) def fibonacci2_sub(m: int) -> int: """ 通过迭代的方式求斐波那契数列,dict1节省了计算次数 :param m:m是序号 :return:返回的是序号为m的斐波那契数列的值 """ if m not in dict1: dict1[m] = fibonacci2_sub(m - 1) + fibonacci2_sub(m - 2) return dict1[m] fibonacci2_sub(n) print(dict1.values()) return dict1 if __name__ == "__main__": fibonacci1(12) ff = {} fibonacci2(12, ff) fibonacci2(13, ff)
- 使用生成器
def fibonacci3(n: int) -> {}: def fibonacci3_sub(m: int): """ 这个是通过生成器求斐波那契数列 :param m: 序号 :return: None """ if m < 2: pass else: a = 1 b = 1 for i in range(1, m + 1): yield a b, a = a + b, b iter1 = fibonacci3_sub(n) dict1 = dict() for index, val in enumerate(iter1): dict1[index + 1] = val return dict1 if __name__ == "__main__": print(fibonacci3(12))