求斐波那契(Fibonacci)数列通项的七种实现方法

求斐波那契数列通项的七种实现方法

方法一:递归

斐波那契数列的递推公式为:F(n) = F(n-1) + F(n-2),为了求得第 n 个斐波那契数,可以通过递归求解,但是递归实现时间复杂度为 O(2^n),随着 n 的增大,运行效率会非常低下。

def fib_recursion(n):
    if n <= 1:
        return n
    return fib_recursion(n-1) + fib_recursion(n-2)

方法二:记忆化递归

方法一中的递归实现重复计算较多,可以通过使用记忆化的方式来优化时间复杂度,将已经计算过的斐波那契数进行缓存,从而在计算后续斐波那契数时避免重复计算。

def fib_memoization(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 1:
        memo[n] = n
    else:
        memo[n] = fib_memoization(n-1, memo) + fib_memoization(n-2, memo)
    return memo[n]

示例:

>>> fib_memoization(10)
55

方法三:迭代

最简单直接的方法是迭代实现,从前往后计算斐波那契数列的每一项。

def fib_iteration(n):
    if n <= 1:
        return n
    a, b = 0, 1
    for i in range(2, n+1):
        a, b = b, a+b
    return b

示例:

>>> fib_iteration(10)
55

方法四:矩阵乘法

使用矩阵的乘法运算可以将斐波那契数列的计算时间复杂度降至 O(log n)

import numpy as np

def matrix_pow(mat, n):
    res = np.eye(mat.shape[0], dtype=int)
    while n > 0:
        if n & 1 == 1:
            res = np.matmul(res, mat)
        mat = np.matmul(mat, mat)
        n >>= 1
    return res

def fib_matrix(n):
    if n <= 1:
        return n
    mat = np.array([[1, 1], [1, 0]], dtype=int)
    res_mat = matrix_pow(mat, n-1)
    return res_mat[0, 0]

示例:

>>> fib_matrix(10)
55

方法五:通项公式

斐波那契数列的通项公式为:F(n) = (1/sqrt(5)) * ((1+sqrt(5))/2)^n - (1/sqrt(5)) * ((1-sqrt(5))/2)^n

import math

def fib_formula(n):
    sqrt_5 = math.sqrt(5)
    phi = (1+sqrt_5)/2
    psi = (1-sqrt_5)/2
    return int((pow(phi, n)-pow(psi, n))/sqrt_5)

示例:

>>> fib_formula(10)
55

方法六:通项公式利用矩阵乘法

通过矩阵乘法,可以将斐波那契数列的通项公式的计算时间复杂度降至 O(log n)

def fib_formula_matrix(n):
    if n <= 1:
        return n
    mat = np.array([[1, 1], [1, 0]], dtype=int)
    phi = np.array([[1+math.sqrt(5), 1-math.sqrt(5)]])/2
    res_mat = matrix_pow(phi.dot(mat), n-1)
    return res_mat[0, 0]

示例:

>>> fib_formula_matrix(10)
55

方法七:通项公式求和

使用斐波那契数列的通项公式可以简单地求得斐波那契数列的前 n 项的和。

def fib_formula_sum(n):
    sqrt_5 = math.sqrt(5)
    phi = (1+sqrt_5)/2
    psi = 1-phi
    return int((pow(phi, n+1)-pow(psi, n+1))/sqrt_5 - 1)

示例:

>>> fib_formula_sum(10)
143

以上就是七种实现斐波那契数列通项的方法,不同的方法各有优劣,选择适合自己的方法可以在实际运用中提高代码效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:求斐波那契(Fibonacci)数列通项的七种实现方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言实现单元测试的示例详解

    首先,在文章标题处应添加一级标题C语言实现单元测试的示例详解。 接下来,对于这篇文章,需要进行以下内容的详细讲解: 1. 单元测试的概念及其意义 在这一部分,应该阐述什么是单元测试,以及它的意义和重要性。可以从以下几个方面进行讲解: 1.1 什么是单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。在C语言中,最小的可测试单元是函数,因此单元测试需…

    C 2023年5月23日
    00
  • 在C语言编程中设置和获取代码组数的方法

    设置和获取代码组数的方法主要是通过定义并使用数组的方式来实现的。下面是详细的C语言编程攻略: 创建一个数组来存储代码组数 首先,我们需要定义一个数组来存储代码组数。假设我们想要存储10组代码,可以这样定义一个名为code_num的整型数组: int code_num[10]; 在上面的代码中,我们定义了一个名为code_num的整型数组,并指定它的大小为10…

    C 2023年5月24日
    00
  • 荣耀畅玩8c怎么关闭后台?荣耀畅玩8c关闭后台应用教程

    下面我来详细讲解“荣耀畅玩8c怎么关闭后台?荣耀畅玩8c关闭后台应用教程”。 前言 荣耀畅玩8c 是一款性价比很高的手机,但是由于部分用户不了解如何关闭后台应用,在使用过程中会导致手机运行变慢、耗电等问题。因此,本文将详细介绍关闭荣耀畅玩8c 后台应用的方法。 步骤 方法一:手动清理后台应用 打开手机界面,找到 物理按键 或者 导航栏 。 双击 物理按键 或…

    C 2023年5月23日
    00
  • C语言如何计算字符串长度

    计算字符串长度是一种常见的字符串操作。在C语言中,字符串是以null字符 (‘\0’) 作为结束符的字符数组,因此计算字符串长度可以通过统计数组中的字符数来实现。下面是计算字符串长度的完整攻略: 方法一:使用标准库函数strlen() C语言标准库提供了一个函数strlen(),它可以非常方便地计算字符串的长度。该函数的定义如下: size_t strlen…

    C 2023年5月23日
    00
  • 一篇文章带你了解C语言:入门基础

    一篇文章带你了解C语言:入门基础 什么是C语言? C语言是一门高级程序设计语言,它的发明者是丹尼斯·里奇和肯·汤普逊。C语言广泛应用于操作系统、编译器、网络设备、嵌入式系统、游戏开发等领域。学会C语言对程序员来说具有重要的意义。 C语言的编译和执行过程 C语言的编译和执行过程分为四个阶段,分别是预处理、编译、汇编和链接。 预处理 在预处理阶段,编译器会读取文…

    C 2023年5月23日
    00
  • C语言利用cJSON解析JSON格式全过程

    当我们需要获取某个Web API的数据时,一般情况下会返回JSON格式的数据。如何使用C语言来解析这些JSON数据呢?这时候,就可以使用cJSON开源库。 cJSON是一款轻量级、快速的C语言JSON解析器。它使用简单,只需要包含一个头文件”cJSON.h”,并将相关代码文件加入到项目中即可。下面将详细讲解cJSON解析JSON格式的全过程。 第一步:安装c…

    C 2023年5月22日
    00
  • C 程序 检查霓虹灯号码

    下面是详细的”C程序检查霓虹灯号码”的使用攻略。 1. 下载与安装 首先,需要在电脑上安装C编译器,例如gcc。可以通过访问以下链接进行下载安装: gcc官网 下载并安装完成后,就可以使用gcc编译器来编译和运行程序。 2. 程序说明 该程序的功能是检查一个4位数字是否为霓虹灯号码。霓虹灯号码是指每个数字的平方和相加等于自身的四位数字。例如:1634 = 1…

    C 2023年5月9日
    00
  • c++显式类型转换示例详解

    C++ 显式类型转换示例详解 什么是显式类型转换 在C++中,有时候我们需要将一种数据类型(例如字符串)转换为另一种数据类型(例如数字)。这就需要使用类型转换操作符。 C++中的类型转换分为两种,一种是隐式类型转换,另一种是显式类型转换。其中隐式类型转换由编译器自动完成,而显式类型转换需要程序员手动调用类型转换操作符进行转换。 显式类型转换的语法 C++支持…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部