ACWing 21.斐波那契数列(Python版)

本文介绍了一种优化的斐波那契数列计算方法,通过使用缓存技术避免了传统递归算法的重复计算,显著提高了计算效率。

题目描述

输入一个整数 n ,求斐波那契数列的第 n 项。
假定从0开始,第0项为0。(n<=39)

样例
输入整数 n=5
返回 5

思路

F(n) = F(n-1)+F(n-2) n>2
若采用直接递归,则会超出运行时间。优化方法:记住已有的结果(缓存)来优化程序性能。

代码实现(Python)

class Solution(object):
    def __init__(self):
        self.__result = [-1]*40

    def Fibonacci(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 0:
            self.__result[n] = 0
        elif n <= 2:
            self.__result[n] = 1
        else:
	        # 递归调用过程中,若已有计算结果则直接返回已有结果,避免重复计算
            if self.__result[n] > 0:	
                return self.__result[n]
            self.__result[n] = self.Fibonacci(n-1) + self.Fibonacci(n-2)
        return self.__result[n]
以下是几种常见的使用 Python 实现斐波那契数列的方法: ### 方法一:递归实现 通过递归的方式可以直观地表达斐波那契数列的定义,但该方法效率较低,因为存在大量的重复计算。 ```python def fibonacci_recursive(n): if n <= 0: return "输入的数字必须是正整数!" elif n == 1 or n == 2: return 1 else: return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) print(fibonacci_recursive(10)) # 输出第10个斐波那契数[^4] ``` ### 方法二:迭代法 采用迭代方式避免了递归中的大量重复计算,因此性能更优。 ```python def fibonacci_iterative(n): if n <= 0: return "输入的数字必须是正整数!" elif n == 1 or n == 2: return 1 a, b = 1, 1 for _ in range(3, n + 1): a, b = b, a + b return b print(fibonacci_iterative(10)) # 输出第10个斐波那契数[^1] ``` ### 方法三:列表存储 此方法将整个序列保存在一个列表中,适合需要获取完整的斐波那契数列的情况。 ```python def fibonacci_list(n): if n <= 0: return [] fib_sequence = [1, 1] for i in range(2, n): fib_sequence.append(fib_sequence[-1] + fib_sequence[-2]) return fib_sequence[:n] print(fibonacci_list(10)) # 输出前10个斐波那契数[^4] ``` ### 方法四:矩阵运算 利用线性代数的知识,可以通过矩阵快速幂来高效求解斐波那契数列。这种方法特别适用于大数值场景。 ```python import numpy as np def fibonacci_matrix(n): F = np.matrix([[1, 1], [1, 0]], dtype='int64') return (pow(F, n)[0, 1]) for i in range(10): print(int(fibonacci_matrix(i)), end=' ') print() ``` 以上代码展示了如何基于矩阵乘法规则加速斐波那契数列的计算过程[^2]。 ### 方法五:函数闭包 通过函数闭包的形式动态生成下一个斐波那契数,这种方式非常适合流式数据处理需求。 ```python def fib_closure(): back1, back2 = 1, 1 def next_fib(): nonlocal back1, back2 back1, back2 = back2, back1 + back2 return back1 return next_fib f = fib_closure() for _ in range(10): print(f(), end=" ") print() ``` 这里实现了每次调用返回一个新的斐波那契项的功能[^3]。 #### 总结 每种方法都有其适用范围和特点,在实际应用时可以根据具体需求选择最合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值