如何实现nBonacci序列?求生成前m项的nBonacci(n,m)函数方案
解决思路与实现方案
核心逻辑梳理
nBonacci序列的规则清晰明确:
- 前
n项固定为1 - 从第
n+1项起,每一项等于前n项的和 - 要返回前
m项,已知m>n,所以需要额外生成m-n个新项——这就是你疑惑的循环次数。
具体实现步骤
- 初始化基础序列:先创建一个包含
n个1的列表,作为序列的起始部分。 - 循环生成后续项:当列表长度小于
m时,重复执行:- 取列表的最后
n个元素(每一项的计算依赖前n项) - 计算这
n个元素的总和,追加到列表末尾
- 取列表的最后
- 返回结果:当列表长度达到
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
相关产品推荐
相关产品推荐

