首页
学习
活动
专区
圈层
工具
发布

找到斐波纳契数的总和

斐波那契数列基础概念

斐波那契数列(Fibonacci sequence)是一个经典的数学序列,定义如下:

  • 前两项:F(0) = 0, F(1) = 1
  • 后续项:F(n) = F(n-1) + F(n-2)(n ≥ 2)

求斐波那契数总和的方法

目标:计算前 n 个斐波那契数的总和(即 F(0) + F(1) + ... + F(n))。

方法1:迭代法(推荐)

直接生成前 n 项并累加,时间复杂度为 O(n),空间复杂度为 O(1)

Python 示例代码

代码语言:txt
复制
def fibonacci_sum(n):
    if n < 0:
        return 0
    a, b = 0, 1
    total = a + b  # 初始化为F(0)+F(1)
    for _ in range(2, n + 1):
        a, b = b, a + b
        total += b
    return total

# 示例:计算前10项的和(F(0)到F(9))
print(fibonacci_sum(9))  # 输出:88

方法2:数学公式法

斐波那契数列的前 n 项和满足性质: Sum(F(0) + F(1) + ... + F(n)) = F(n+2) - 1 因此只需计算 F(n+2) 并减1。

Python 示例代码

代码语言:txt
复制
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

def fibonacci_sum_math(n):
    return fibonacci(n + 2) - 1

print(fibonacci_sum_math(9))  # 输出:88

方法3:递归法(不推荐)

递归实现简单但效率低(时间复杂度 O(2^n)),仅适合小规模 n

Python 示例代码

代码语言:txt
复制
def fibonacci_recursive(n):
    if n <= 1:
        return n
    return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

def fibonacci_sum_recursive(n):
    return sum(fibonacci_recursive(i) for i in range(n + 1))

print(fibonacci_sum_recursive(9))  # 输出:88

应用场景

  1. 算法教学:用于演示递归、动态规划等编程思想。
  2. 金融模型:如股票价格波动分析。
  3. 自然科学:描述植物叶序、蜂巢结构等自然现象。

常见问题与解决

  1. 问题:栈溢出(递归法) 原因:递归深度过大。 解决:改用迭代法或记忆化递归(缓存中间结果)。
  2. 问题:性能差(大 n 计算慢) 原因:未优化算法。 解决:使用矩阵快速幂法(时间复杂度 O(log n)),适合极大 n

快速幂法示例(Python)

代码语言:txt
复制
def matrix_mult(a, b):
    return [
        [a[0][0]*b[0][0] + a[0][1]*b[1][0], a[0][0]*b[0][1] + a[0][1]*b[1][1]],
        [a[1][0]*b[0][0] + a[1][1]*b[1][0], a[1][0]*b[0][1] + a[1][1]*b[1][1]]
    ]

def matrix_pow(mat, power):
    result = [[1, 0], [0, 1]]  # 单位矩阵
    while power > 0:
        if power % 2 == 1:
            result = matrix_mult(result, mat)
        mat = matrix_mult(mat, mat)
        power //= 2
    return result

def fibonacci_fast(n):
    if n == 0:
        return 0
    mat = [[1, 1], [1, 0]]
    result = matrix_pow(mat, n - 1)
    return result[0][0]

def fibonacci_sum_fast(n):
    return fibonacci_fast(n + 2) - 1

print(fibonacci_sum_fast(100))  # 快速计算大n的和

总结

  • 小规模 n:迭代法或数学公式法足够。
  • 大规模 n:优先使用快速幂法。
  • 避免递归:除非结合记忆化优化。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JavaScript斐波纳契数列非递归算法

    一般斐波纳契数列采用递归或是数组缓存的方式,这里的方法不考虑重复计算斐波纳契数列的情况。...fibonacci 数列定义,查看百度百科的解释>> n = 1,2 时,fib(n) = 1 n > 2 时,fib(n) = fib(n-2) + fib(n-1) 1、递归 function...a = b - a;     }     return a + b; } 对比: 如果只使用一次运算,第三种方法速度最快; 如果多次使用,第二种方法明显优于其它两种; 在n较大的情况下不推荐使用第一种...;n为10*10000的时候递归就已经报内存溢出了 下面是在IE8下测试的结果(n为100W): ?...如果只需要计算一次,第三种方法应该是最优的,而且当n越大的时候,数组占有的内存空间也将越大。 完整代码: <!

    53610

    动态规划:斐波那契数

    今天这道题目恰巧是昨天力扣上的每日一题,力扣怎么知道我要拿斐波那契数作为动规的入门题,力扣不会把明天的题目也给我剧透了吧,哈哈哈 通知:我已经将刷题攻略全部整理到了Github :https://github.com...斐波那契数 题目地址:https://leetcode-cn.com/problems/fibonacci-number/ 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。...) = F(2) + F(1) = 1 + 1 = 2 示例 3: 输入:4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3 提示: 0 <= n <= 30 思路 斐波那契数列大家应该非常熟悉不过了...动态规划 动规五部曲: 这里我们要用一个一维dp数组来保存递归的结果 确定dp数组以及下标的含义 dp[i]的定义为:第i个数的斐波那契数值是dp[i] 确定递推公式 为什么这是一道非常简单的入门题目呢...总结 斐波那契数列这道题目是非常基础的题目,我在后面的动态规划的讲解中将会多次提到斐波那契数列! 这里我严格按照关于动态规划,你该了解这些!

    47320

    DP入门之斐波那契数

    斐波那契数 力扣题目链接:https://leetcode-cn.com/problems/fibonacci-number 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。...(3) = F(2) + F(1) = 1 + 1 = 2 示例 3: 输入:4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3 提示: 0 <= n <= 30 思路 斐波那契数列大家应该非常熟悉不过了...所以我总结的动规五部曲,是要用来贯穿整个动态规划系列的,就像之前讲过二叉树系列的递归三部曲,回溯法系列的回溯三部曲一样。后面慢慢大家就会体会到,动规五部曲方法的重要性。...动态规划 动规五部曲: 这里我们要用一个一维dp数组来保存递归的结果 确定dp数组以及下标的含义 dp[i]的定义为:第i个数的斐波那契数值是dp[i] 确定递推公式 为什么这是一道非常简单的入门题目呢...总结 斐波那契数列这道题目是非常基础的题目,我在后面的动态规划的讲解中将会多次提到斐波那契数列! 这里我严格按照关于动态规划,你该了解这些!

    57810
    领券