吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1373|回复: 10
收起左侧

[Python 原创] 斐波那契数列通项的Python实现

[复制链接]
hrh123 发表于 2023-8-7 14:43
本帖最后由 hrh123 于 2023-8-24 18:06 编辑

斐波那契数列通项的Python实现

斐波那契数列的递推定义

序列
https://gitee.com/hrh233/my-pics/raw/master/pics/fib1.jpg
称为斐波那契数列

由此定义,我们可以得出一个简单的Python程序

def fibonacci_1(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_1(n - 1) + fibonacci_1(n - 2)

利用lambda表达式略微简化代码可得


fibonacci_2 = (lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))))(
    lambda f: lambda n: 0 if n == 0 else (1 if n == 1 else f(n - 1) + f(n - 2))
)

当你使用了这个函数,你会发现当输入数据过大会导致内存溢出,因为函数的递归调用会占用大量的内存,所以我们需要一种方法来避免这种问题

明显公式

除递推定义外,有一个斐波那契数列的明显公式
https://gitee.com/hrh233/my-pics/raw/master/pics/fib2.jpg
由此,我们能给出简单的代码

import math

def fibonacci_3(n):
    return (math.sqrt(5) / 5) * (
        ((1 + math.sqrt(5)) / 2) ** n - ((1 - math.sqrt(5)) / 2) ** n
    )

当你使用时,你会发现输出的并不是整数,这是常见的浮点数精度bug;同时,我们会发现当数据很大时会出现OverFlow Error,因此代码需要完善,比如:

import decimal

def fibonacci_4(n):
    decimal.getcontext().prec = 1000 #  这里精度越大程序越精确,相应地,占用和速度也会收到影响
    s5 = decimal.Decimal(5).sqrt()
    result = (s5 / 5) * (((1 + s5) / 2) ** n - ((1 - s5) / 2) ** n)
    result = int(round(result, 0))
    return result

这样我们就用decimal库解决了精度问题,同时,我们使用round函数将结果四舍五入,这样就能够输出更好的结果了.

矩阵快速幂

很明显地,当n特别巨大时,像前面那样计算会非常缓慢,因此,我们需要使用矩阵快速幂来计算,这样,时间复杂度就能变为O(logn),能在短时间内计算出结果,就像这样:

class Matrix:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

    def __mul__(self, other):
        return Matrix(
            self.a * other.a + self.b * other.c,
            self.a * other.b + self.b * other.d,
            self.c * other.a + self.d * other.c,
            self.c * other.b + self.d * other.d,
        )

def fast_power(A, n):
    if n == 0:
        return Matrix(1, 0, 0, 1)
    elif n == 1:
        return A
    elif n % 2 == 0:
        return fast_power(A * A, n // 2)
    else:
        return A * fast_power(A * A, (n - 1) // 2)

def fibonacci_5(n):
    if n < 0:
        return "Invalid input"
    elif n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        A = Matrix(0, 1, 1, 1)
        return fast_power(A, n).b

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
sanmubird + 1 + 1 很棒!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

TL1ng 发表于 2023-8-7 15:12
来回顾回顾Python,挺好
mujinwen08 发表于 2023-8-7 15:37
TedChen 发表于 2023-8-7 15:55
23166 发表于 2023-8-7 17:14
自学求推荐
sai609 发表于 2023-8-7 17:27
TedChen 发表于 2023-8-7 15:55
想自学Python有什么视频或者老师推荐的吗?

网络资源,唾手可得,实在丰富。。
zhangrun2024 发表于 2023-8-7 18:26
牛皮克拉斯,666
SpringContext 发表于 2023-8-7 18:26
挺好,回顾一下
头像被屏蔽
zhangrun580 发表于 2023-8-7 18:27
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽
zhangrundsg 发表于 2023-8-7 18:27
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表