Python婓波那契数列(Fibonacci sequence)

这篇具有很好参考价值的文章主要介绍了Python婓波那契数列(Fibonacci sequence)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、斐波那契数列(Fibonacci sequence)

斐波那契数列(Fibonacci sequence)是一个非常神奇和有趣的数列,又被称为黄金分割数列或兔子数列。

在数学上,斐波那契数列定义为:第一项F(1)=0,第二项F(2)=1,而后续每一项都是前两项的和,即F(n)=F(n-1)+F(n-2)(n≥3),因此,斐波那契数列的前几个数字是:0、1、1、2、3、5、8、13、21、34、……

此外,斐波那契数列也有通项公式,它可以使用无理数和幂次的形式表示数列中的任意一项。这个通项公式相对复杂,涉及黄金分割比(φ = (1+√5)/2)及其共轭(ψ = (1-√5)/2)。对于第n项,通项公式可以写作:F(n) = (φ^n - ψ^n) / √5

在这里,φ和ψ分别是黄金分割比及其共轭,√5表示5的平方根。需要注意的是,虽然φ和ψ是无理数,但斐波那契数列的每一项都是整数。

二、用Python实现婓波那契函数

使用函数递归或非递归的方式都可以方便地计算斐波那契函数:F(1)=0,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3)

1、递归方法:

def fibonacci_recursive(n):
    if n <= 0:
        return "输入错误,请输入正整数"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)

if __name__ == '__main__':
    n = int(input())
    print(fibonacci_recursive(n))

2、迭代方法:

def fibonacci_iterative(n):
    if n <= 0:
        return "输入错误,请输入正整数"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        a, b = 0, 1
        # 这个循环的作用是从第2项开始,迭代计算斐波那契数列中的每一项,直到达到第 n 项为止。
        for _ in range(2, n):  # 循环变量 _ 是一个常用的占位符,表示我们在循环中不打算使用这个变量的值。
            a, b = b, a + b  # 在每次循环迭代中,a 和 b 的值会更新为下一对斐波那契数列中的两个连续数字。具体来说,a 会更新为 b,而 b 会更新为 a + b。
        return b  # 循环结束后,变量 b 的值就是斐波那契数列中的第 n 项

if __name__ == '__main__':
    n = int(input())
    print(fibonacci_iterative(n))

以上两种方法中,递归方法虽然简洁,但是效率较低,因为有很多重复的计算。在实际应用中,我们更倾向于使用迭代方法,因为它避免了重复计算,提高了效率。

3、公式法:

对于第n项的斐波那契数列,可以使用通项公式进行计算。例如,对于第10项的斐波那契数列,可以使用以下公式进行计算:
F(10) = (φ^10 - ψ^10) / √5
其中,φ和ψ分别是黄金分割比及其共轭,√5表示5的平方根。

def fibonacci_formula(n):
    if n <= 0:
        return "输入错误,请输入正整数"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        return (pow((1+5**0.5)/2, n) - pow((1-5**0.5)/2, n)) / 5**0.5

if __name__ == '__main__':
    n = int(input())
    print(fibonacci_formula(n))

这段代码是计算斐波那契数列的一种方法,具体来说,它是通过使用黄金分割比φ=(1+√5)/2来快速计算第n个斐波那契数。下面是对这段代码的逐步解释:

  • 5**0.5:这是计算5的平方根。
  • -(1+5**0.5)/2 和 (1-5**0.5)/2:这两个表达式计算了黄金分割比φ和它的共轭ψ的值。黄金分割比φ是一个无理数,其近似值为1.618033988749895。
  • -pow((1+5**0.5)/2, n) pow((1-5**0.5)/2, n):这两个函数调用计算了φ和ψ的n次幂。
  • -(pow((1+5**0.5)/2, n) - pow((1-5**0.5)/2, n)) / 5**0.5:这个表达式计算了第n个斐波那契数。通过利用φ和ψ的性质,我们避免了直接计算φ和ψ的n次幂,从而提高了效率。

因此,这段代码通过利用数学公式和技巧,有效地计算了斐波那契数列中的第n个数。

4、矩阵快速幂法:

def fibonacci_matrix(n):  
    if n <= 0:  
        return "输入错误,请输入正整数"  
    elif n == 1:  
        return 0  
    elif n == 2:  
        return 1  
    else:  
        phi = (1+5**0.5)/2  
        psi = (1-5**0.5)/2  
        a = psi/phi**0.5  
        b = phi**n - a**n * psi**n / phi**n  
        return int(b * phi**0.5)
        
if __name__ == '__main__':
    n = int(input())
    print(fibonacci_matrix(n))

这个函数使用矩阵快速幂方法来高效地计算斐波那契数列中的第n项。这种方法利用了矩阵的幂运算的性质,避免了传统的递归或迭代方法中的重复计算,从而大大提高了计算效率。

5、动态规划法:

动态规划是一种通过将问题分解为更小的子问题并存储子问题的解决方案,以便在解决更大的问题时重复使用它们的方法。

def fibonacci_dynamic_programming(n):  
    if n <= 0:  
        return "输入错误,请输入正整数"  
    # 如果n等于1,则返回斐波那契数列的第一项0。
    elif n == 1:  
        return 0  
    # 如果n等于2,则返回斐波那契数列的第二项1。
    elif n == 2:  
        return 1  
    else: 
    		 # 初始化一个长度为n的列表dp,其中前两项0和1是已知的斐波那契数列的前两项,其余项初始化为0。
        dp = [0, 1] + [0] * (n-2)  
        for i in range(2, n):  # 从第三项开始循环计算斐波那契数列的每一项。
            dp[i] = dp[i-1] + dp[i-2]  # 根据斐波那契数列的定义,当前项等于前两项之和。
        return dp[n-1]  # 返回计算得到的斐波那契数列的第n项的值。
if __name__ == '__main__':
    n = int(input())
    print(fibonacci_dynamic_programming(n))

对于斐波那契数列,我们可以将其视为一个递归问题,其中每个数是前两个数的和。
为了解决这个问题,我们可以使用动态规划来避免递归的重复计算。

  • 我们将问题分解为更小的子问题:计算斐波那契数列的前两项(0和1),然后创建一个列表dp来存储子问题的解。dp列表的长度为n,其中前两项已经填充为0和1,其余项初始化为0。
  • 然后,它循环遍历从第三项到第n项,根据斐波那契数列的定义(每个数是前两个数的和)来填充列表。最后,它返回列表中的第n-1个元素,这是斐波那契数列的第n项。

6、缓存法:

缓存法,是一种使用记忆化(也称为缓存)技术。记忆化是一种优化技术,用于存储已经计算过的子问题的结果,以便在后续需要时重复使用,而不是重新计算。
使用记忆化技术的主要优势是避免了大量的重复计算。在递归计算斐波那契数列时,对于每个索引 n,都需要计算 fibonacci(n-1) 和 fibonacci(n-2)。如果没有缓存,这将导致大量的重复计算。通过使用缓存,我们可以存储已经计算过的斐波那契数,并在需要时直接从缓存中获取它们,从而提高计算效率。文章来源地址https://www.toymoban.com/news/detail-847108.html

def fibonacci_cache(n):  
    # 这是一个字典,用于存储已经计算过的斐波那契数列的值。其键是计算斐波那契数的索引,值是对应的斐波那契数。
    cache = {}  
    # 这个函数用于计算斐波那契数列的第 n 项。
    def fibonacci(n):  
        if n in cache:  
            return cache[n] 
        elif n <= 0:  # 添加此条件检查
            raise ValueError("输入的数字应为正整数")  # 当n为负数时引发异常 
        elif n == 1:  
            result = 0  
        elif n == 2:  
            result = 1  
        # 对于其他 n,使用递归的方式计算斐波那契数列的第 n 项。
        # 递归地调用 fibonacci(n-1) 和 fibonacci(n-2),并将它们的和存储在 result 中。
        else:  
            result = fibonacci(n-1) + fibonacci(n-2)  
        cache[n] = result  # 将计算得到的 result 作为键 n 的值存储在 cache 中,以便下次可以直接从缓存中获取该值。
        return result  
    return fibonacci(n)
    
if __name__ == '__main__':
    n = int(input())
    print(fibonacci_cache(n))

到了这里,关于Python婓波那契数列(Fibonacci sequence)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 中如何实现斐波那契数列递归函数?

    斐波那契数列是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, ...... 该数列从第三项开始,每一项都等于前两项之和。  这里我们使用递归的方法来实现斐波那契数列:   这个递归函数的基本思路是:  1. 斐波那契数列的前两项是 1。所以如果 n = 1,直接返回 n。 2. 否则,计算前两项 fib(n-1

    2024年02月01日
    浏览(39)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(54)
  • 斐波那契数列应用2

    目录 斐波那契数列应用2 程序设计 程序分析  系列文章 【问题描述】定义如下序列:f(1)=1,f(2)=1;f(n)=(A*f(n-1)+B*f(n-2))mod7     给定A和B,请你计算f(n)的值。 【输

    2023年04月10日
    浏览(56)
  • 斐波那契数列verilog实现

     前言:         该题为睿思芯科笔试题,笔试时长20分钟。         用代码实现斐波那契数列,代码需要对对enable敏感,当enable为高几周期,sum在enble为高的下一周期输出第几个斐波那契数,斐波那契数列的生成是后一个数字是前两个数字之和,如下序列:0、1、1、

    2024年02月13日
    浏览(42)
  • 矩阵快速幂&斐波那契数列

    矩阵快速幂: 快速地求出斐波那契数列中的每一项 可以快速地求出斐波那契数列的前n项的和 首先我们来看如何快速地求出斐波那契数列的第n项 设 F n = [ f n , f n + 1 ] F_n = [f_n,f_{n+1}] F n ​ = [ f n ​ , f n + 1 ​ ] ,构造这一个行向量,那么对于此,我们思考 F n F_n F n ​ 乘一个

    2024年02月06日
    浏览(47)
  • c 斐波那契数列输出

    在C语言中,我们可以通过递归或循环的方法来实现斐波那契数列的输出。首先,我们需要明白斐波那契数列的定义:任一项数字是前两项的和(最开始两项均定义为1)。下面是具体的实现方式。 使用递归方法: #include stdio.h int main() {     int m = 0, n = 1, sum;     printf(\\\"请输入

    2024年02月06日
    浏览(48)
  • 【动态规划】斐波那契数列模型

    冻龟算法系列之斐波那契数列模型 动态规划(英语:Dynamic programming,简称 DP) ,是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质

    2024年02月09日
    浏览(65)
  • LeetCode刷题---斐波那契数列模型

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》  《C/C++》  《LeedCode刷题》 键盘敲烂,年薪百万! 题目链接:1137. 第 N 个泰波那契数   泰波那契序列Tn定义如下:         T0=0,T1=1,T2= 1,且在n=0的条件下Tn+3= Tn+Tn+1t+Tn+2         给你整数n,请返回第n个泰波那契数Tn的值

    2024年02月04日
    浏览(53)
  • 斐波那契数列(C/C++)

    目录 背景介绍 解法1:非数组+非递归 解法2:数组+非递归 解法3:非数组+递归 解法4:数组+递归 斐波那契数列 ,又称 黄金分割数列 ,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(

    2024年02月06日
    浏览(56)
  • 编程输出斐波那契数列(简单)

    目录 题目 分析思路 数组法 迭代法 代码 数组法: 迭代法: 编程输出斐波那契数列         斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……         在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包