斐波那切数列--剑指offer

本文介绍了一个高效的算法来求解斐波那切数列的第n项,避免了传统递归方法的大量重复计算,通过循环迭代实现了时间和空间上的优化。

题目:
写一个函数,输入n,求斐波那切数列的第n项。斐波那切数列的定义如下
0 n=0
f(n) = 1 n=1
f(n-1)+ f(n-2) n>1

思路:
直接进行递归会出现大量的重复计算,效率很低。因此使用循环的方法解决。

public class Solution {
    public static long Fibonacci(int n){
        if (n<=0) return 0;
        if (n==1) return 1;
        long before = 0;
        long after = 1;
        long ans=0;
        for (int i = 1; i <n ; i++) {
            ans = before+after;
            before = after;
            after = ans;
        }
        return ans;
    }
}
### 用Python实现斐波那契数列 斐波那契数列是一种经典的数学数列,其定义为:第0项为0,第1项为1,从第2项开始,每一项等于前两项之和。在Python中,可以通过多种方法实现该数列的计算,以下是几种常见的实现方式。 #### 方法一:递归法 递归法是最直接的方式,但效率较低,时间复杂度为 \(O(2^n)\)。代码如下: ```python def fibonacci_recursive(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) # 示例 n = 10 print([fibonacci_recursive(i) for i in range(n)]) ``` 这种方法虽然简洁,但由于大量的重复计算,对于较大的 \(n\) 不适用[^1]。 #### 方法二:迭代法 迭代法通过循环计算每一项值,时间复杂度为 \(O(n)\),空间复杂度为 \(O(1)\)。代码如下: ```python def fibonacci_iterative(n): if n == 0: return 0 a, b = 0, 1 for _ in range(1, n): a, b = b, a + b return b # 示例 n = 10 print([fibonacci_iterative(i) for i in range(n)]) ``` 此方法避免了递归带来的栈溢出问题,同时减少了不必要的重复计算[^2]。 #### 方法三:矩阵快速幂法 矩阵快速幂法利用斐波那契数列的矩阵形式进行加速计算,时间复杂度为 \(O(\log n)\)。代码如下: ```python import numpy as np def fibonacci_matrix(n): if n == 0: return 0 F = np.array([[1, 1], [1, 0]], dtype=object) result = np.linalg.matrix_power(F, n - 1) return result[0, 0] # 示例 n = 10 print([fibonacci_matrix(i) for i in range(n)]) ``` 这种方法适用于需要高效计算大数的情况,但实现较为复杂[^1]。 #### 方法四:动态规划动态规划法通过保存中间结果来减少重复计算,时间复杂度为 \(O(n)\),空间复杂度为 \(O(n)\)。代码如下: ```python def fibonacci_dp(n): if n == 0: return 0 dp = [0] * (n + 1) dp[1] = 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] # 示例 n = 10 print([fibonacci_dp(i) for i in range(n)]) ``` 这种方法适合需要多次查询不同位置值的场景[^4]。 ### 总结 以上介绍了四种实现斐波那契数列的方法,各有优缺点。选择具体实现时需根据实际需求权衡效率与实现复杂度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值