【A-剑指offer】10-斐波那契数列 python实现

版权声明:转载请声名出处,谢谢 https://blog.csdn.net/u010591976/article/details/81986890

题目表述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39

'''
Creat by HuangDandan
2018-08-23
[email protected]

三种方法求斐波那契额数列值
Fabonacci0 自上而下的递归,存在的重复的结点,时间复杂度随着n的增加指数增长,效率很低
Fabonacci1 自下而上的递归,时间复杂度为O(n)
Fabonacci2 利用斐波那契数组的特性进行数列求解,直接求解时间复杂度O(n)
Fabonacci3 利用斐波那契数组的特性进行数列求解,采用递推的算法求n次方,时间复杂度可以达到O(logn)

关键是对递推的理解

'''

#自上而下的递归,时间复杂度随着n的增加指数增长
def Fabonacci0(n):
    if n <=0:
        return 0
    elif n ==1:
        return 1
    else:
        return (Fabonacci0(n-1)+Fabonacci0(n-2))

#自下而上的递归,时间复杂度为O(n)
def Fabonacci1(n):
    if n <=0:
        return 0
    elif n ==1:
        return 1
    else:
        temp0 = 0
        temp1 = 1
        for i in range(2, n+1):
            res = temp0 + temp1
            temp0 = temp1
            temp1 = res
        return res

import numpy as np

# 直接求二维数组的n次方,时间复杂度为O(logn)
def Fabonacci2(n):
    base = np.array([[1, 1], [1, 0]])
    res = [[1, 0], [0, 1]]

    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        for i in range (2,n+1):
            res = np.dot(res, base)
    return res[0][0]


#直接求二维数组的n次方,时间复杂度为O(n)
def Fabonacci3(n):          #返回值为数值
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return FabonacciCord(n-1)[0][0]

#FabonacciCord函数求[[1,1],[1,0]]^n的值,递推求解
def FabonacciCord(n):  #n是形参,取值大于等于1,返回值必须为数组,才能进行递归操作
    base = np.array([[1, 1],[1, 0]])
    if n <= 0:
        return ValueError
    elif n == 1:
        return base
    else:
        res = FabonacciCord(n >> 1)  #(n-1)//2 >=1  n的取值大于等于3 这样递推操作时才能满足形参大于等于1
        res = np.dot(res,res)                     #res *= res 这是数组array对应位置数值相乘,应该为点乘
        if n & 0x1 == 1:
            res = np.dot(res,base)
        return res

if __name__ == "__main__":
    print(Fabonacci2(4))




猜你喜欢

转载自blog.csdn.net/u010591976/article/details/81986890
今日推荐