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)
  1. 使用生成器
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))
上一篇 下一篇

猜你喜欢

热点阅读