求斐波那契(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日

相关文章

  • Qt数据库应用之实现数据打印到纸张

    实现数据打印到纸张通常需要使用第三方库或者一些特定的框架,而Qt作为一种优秀的跨平台开发框架,也提供了相关的类和方法来实现数据的打印。下面,我将详细讲解Qt数据库应用之实现数据打印到纸张的完整攻略,其中将会包含两条示例代码演示。 1. 准备工作 在进行打印操作之前,需要进行如下准备工作: 1.1 创建一个Qt应用程序 首先,需要在Qt IDE中创建一个Qt应…

    C 2023年5月22日
    00
  • C语言实现简单的贪吃蛇游戏的示例代码

    下面是详细的讲解“C语言实现简单的贪吃蛇游戏的示例代码”的攻略。 1. 前置知识 在开始编写贪吃蛇游戏代码之前,我们需要了解一些基本的C语言知识,包括:基本数据类型、条件语句、循环语句、函数、数组等等。如果对这些基础知识掌握不够熟练,建议先学习一下。 2. 游戏规则设计 在编写代码之前,我们需要明确游戏的规则和基本操作,例如: 蛇的移动方式:蛇可以向上、下、…

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

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

    C 2023年5月23日
    00
  • C语言指针算术运算

    下面是对“C语言指针算术运算”的详细讲解: 一、C语言指针算术运算简介 C语言中,指针算术运算指的是对指向某个数据类型对象的指针进行加减运算的过程。运算的结果是指针类型的值,指向新的地址,这个新的地址是运算前指针地址和运算对象的数据类型大小的乘积(单位是字节)所形成的。 C语言中的指针算术运算具有如下两条规则: 指针类型和加减对象的类型必须是一致的。 对指针…

    C 2023年5月9日
    00
  • C++11 并发指南之Lock 详解

    C++11 并发指南之 Lock 详解 什么是 Lock Lock 是一种同步机制,用于保护共享资源以避免并发访问。当多个线程访问同一个共享资源时,Lock 可以确保每个线程在使用共享资源时都是互斥的,从而避免竞态条件(Race Condition)和内存相关的不一致性问题。 Lock 的使用方法 C++11 中提供了两种 Lock 的实现方式:std::m…

    C 2023年5月22日
    00
  • Android App调试内存泄露之Cursor篇

    Android App调试内存泄露之Cursor篇 什么是内存泄露 Android应用程序中常见的问题是内存泄漏问题。内存泄漏指的是程序中的对象在使用完之后仍然被占用并未得到垃圾回收,导致内存空间不断被占满,从而引发ANR和崩溃等问题。 Cursor泄露的原因 在Android开发中,我们使用Cursor对象进行数据的操作。Cursor对象是一种轻量级的数据…

    C 2023年5月23日
    00
  • python求解三角形第三边长实例

    接下来我将详细讲解“Python求解三角形第三边长实例”的完整攻略,包括以下内容: 题目描述 实现思路 代码实现 示例说明 1. 题目描述: 给出三角形两条边的长度,求第三条边的长度。 2. 实现思路: 假设已知三角形两边分别为a、b,其夹角为C。则可通过以下公式求解第三边长: c = math.sqrt(a ** 2 + b ** 2 – 2 * a * …

    C 2023年5月22日
    00
  • C语言 字符串指针详解及示例代码

    C语言 字符串指针详解及示例代码 什么是字符串指针? 在C语言中,字符串指针通常用来存储字符串的地址,字符串指针变量以及字符串变量有所不同:字符串变量是进行字符串内容及长度操作的,而字符串指针变量不同,它仅存储字符串的地址,这意味着字符串指针变量可以指向不同的字符串。 字符串指针变量的声明方式: char *stringPointer; 字符串指针的赋值 字…

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