zoukankan      html  css  js  c++  java
  • 实现斐波拉契数列的四种方式python代码

    斐波那契数列

    1. 斐波拉契数列简介

    斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

    其实就是从第三项开始,每项的值等于前两项的和。

    下面是在面试中常见的问题:青蛙跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    只有一级台阶时,1;

    有两节台阶的时候有两种跳法,11和2;

    有三节台阶的时候有三种跳法,111、12、21

    有四阶台阶的时候,有五种跳法,1111、112、121、22、211

    2. 实现斐波拉契数列生成

    2.1 使用匿名函数的方式生成

      fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
    

    通过执行fib(n)来输出斐波那契数列前n项的值。

    也可以通过listData = [fib(i) for i in range(1,n)]来生成斐波拉契数列前n项的值,最后通过print listData可以打印出结果。

    2.2 利用装饰器的方式生成

      def memo(func):
        cache = {}
        def wrap(*args):
            if args not in cache:
                cache[args] = func(*args)
            return cache[args]
        return wrap
    
    
    @ memo
    def fib(i):
        if i < 2:
            return 1
        return fib(i-1) + fib(i-2)
    

    2.3 定义简单的方法来实现

      def fib(n):
        a, b = 0, 1
        for _ in xrange(n):
            a, b = b, a + b
        return b
    

    2.4 利用迭代器的方式实现(Python3)

      class Fib(object):
        def __init__(self):
            self.prev = 0
            self.curr = 1
    
        def __iter__(self):
            return self
    
        def __next__(self):
            value = self.curr
            self.curr += self.prev
            self.prev = value
            return value
    

    2.5 利用迭代器的方式实现(Python2)

    python2需要修改__next__(self):方法,其实生成的是一个无限循环的迭代器,也可以使用 itertools模块把无限迭代器转为有限迭代器。

      from itertools import islice
    
      class Fib:
          def __init__(self):
              self.prev = 0
              self.curr = 1
    
          def __iter__(self):
              return self
    
          def __next__(self):
              value = self.curr
              self.curr += self.prev
              self.prev = value
              return value
    
      >>> f = Fib()
      >>> list(islice(f, 0, 10))
      [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  • 相关阅读:
    循环语句的基本使用
    创建一个可拖动的dom元素。
    JavaScript中的callee,caller,call,apply的使用
    两个数组去重的方法。
    利用setTimeout建立能捕捉鼠标多次点击和鼠标长按的事件处理程序。
    document.getElementByClassName()的使用和兼容老浏览器。
    jQuery .data()方法的运用。
    javascript对象的深拷贝。
    未来、
    linux上机作业
  • 原文地址:https://www.cnblogs.com/skaarl/p/9692667.html
Copyright © 2011-2022 走看看