zoukankan      html  css  js  c++  java
  • python解决斐波拉契问题的n种方法

    1.最常用的是递归,但是在python中递归的深度有限

    def fibonacci(n):
        if n==1 or n==2:
            return 1
        else:
            return fibonacci(n-1) + fibonacci(n-2)

    2.迭代方法,通过保存中间变量来求解斐波拉契

    def fibonacci(n):
        a = 0
        b = 1
        while n>0:
            a, b = b, a+b
            n -= 1
        return a

    在python中保存中间变量可以有多种实现

    用 yield 生成器实现斐波拉契:

    def fibonacci(n):
        a = 0
        b = 1
        while n>0:
            a, b = b, a+b
            n -= 1
            yield a

    装饰器给fibonacci加缓存来实现斐波拉契:

    from functools import wraps
    def memo(fn):
        cache = {}
        miss = object()
    
        @wraps(fn)
        def wrapper(*args):
            result = cache.get(args, miss)
            if result is miss:
                result = fn(*args)
                cache[args] = result
            return result
    
        return wrapper
    
    @memo
    def fib(n):
        if n < 2:
            return n
        return fib(n - 1) + fib(n - 2)
        
    print fib(10)

    尾递归实现斐波拉契:

    def fib(n):
        def fib_iter(n,x,y):
            if n==0 : return x
            else : return fib_iter(n-1,y,x+y)
        return fib_iter(n,0,1)

    利用列表实现斐波拉契:

    def fib(n):
        fibs = [0, 1]
        for number in range(n-1):
                fibs.append(fibs[-2] + fibs[-1])
        print fibs[-1]

    3.矩阵求解斐波拉契

    def getNthNumber(n):
            n = n+1
            def m1(a,b):
                m=[[],[]]
                m[0].append(a[0][0]*b[0][0]+a[0][1]*b[1][0])%1000000007)
                m[0].append((a[0][0]*b[0][1]+a[0][1]*b[1][1])%1000000007)
                m[1].append((a[1][0]*b[0][0]+a[1][1]*b[1][0])%1000000007)
                m[1].append((a[1][0]*b[1][0]+a[1][1]*b[1][1])%1000000007)
                return m
            def m2(a,b):
                m=[]
                m.append((a[0][0]*b[0][0]+a[0][1]*b[1][0])%1000000007)
                m.append((a[1][0]*b[0][0]+a[1][1]*b[1][0])%1000000007)
                return m
            return m2(reduce(m1,[[[0,1],[1,1]] for i in range(n)]),[[0],[1]])[0]

    4.公式求解斐波拉契

    斐波拉契的通项公式为: 

    def fibonacci(n):
        z = pow(5.0, 0.5)
        x = pow((1+z)/2, n)
        y = pow((1-z)/2, n)
        return ((x-y)/z)
  • 相关阅读:
    vue项目开发基本目录结构
    小程序图片上传七牛
    vue2.0无限滚动加载数据插件
    Vue使用vue-echarts图表
    vue-countTo---简单好用的一个数字滚动插件
    vee-validate的使用
    javaScript---RegExp
    JavaScript 特效之四大家族(offset/scroll/client/event)
    CSS3 三次贝塞尔曲线(cubic-bezier)
    require和import区别
  • 原文地址:https://www.cnblogs.com/lkprof/p/4704163.html
Copyright © 2011-2022 走看看