You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现nBonacci序列?求生成前m项的nBonacci(n,m)函数方案

解决思路与实现方案

核心逻辑梳理

nBonacci序列的规则清晰明确:

  • 前n项固定为1
  • 从第n+1项起,每一项等于前n项的和
  • 要返回前m项,已知m>n,所以需要额外生成m-n个新项——这就是你疑惑的循环次数。

具体实现步骤

  1. 初始化基础序列:先创建一个包含n个1的列表,作为序列的起始部分。
  2. 循环生成后续项:当列表长度小于m时,重复执行:
    • 取列表的最后n个元素(每一项的计算依赖前n项)
    • 计算这n个元素的总和,追加到列表末尾
  3. 返回结果:当列表长度达到m时,直接返回即可。

代码实现

def nBonacci(n, m):
    # 初始化前n个1
    sequence = [1] * n
    # 需要生成m-n个新项,循环m-n次
    for _ in range(m - n):
        # 计算最后n项的和
        next_num = sum(sequence[-n:])
        sequence.append(next_num)
    return sequence

# 测试示例
print(nBonacci(3, 8))  # 输出: [1, 1, 1, 3, 5, 9, 17, 31]

和你现有fib函数的差异说明

你现有的fib函数是生成不大于num的斐波那契数,而nBonacci是固定返回前m项。如果把n=2代入上面的函数,就是标准的斐波那契序列(起始为两个1,符合题目要求的推广形式)。

优化提示(可选)

如果n和m数值很大,每次调用sum(sequence[-n:])会重复计算,效率可以优化:维护一个当前总和变量,每次新项生成后,总和 = 总和 * 2 - 被移出的最旧项(因为前n项的和加上新项,再减去最早的那个项,就是下一次的前n项和)。示例代码:

def nBonacci_optimized(n, m):
    sequence = [1] * n
    current_sum = n  # 前n项的和是n*1
    for _ in range(m - n):
        next_num = current_sum
        sequence.append(next_num)
        # 更新总和:减去被移出的项(当前列表的第0项,因为新项加入后,前n项变为从第1项到新项)
        current_sum = current_sum * 2 - sequence[-(n+1)]
    return sequence

这个版本避免了重复求和,时间复杂度从O(m*n)降到O(m),适合大数值场景。

内容的提问来源于stack exchange,提问作者larry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:01:17