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

Python生成10项斐波那契数列遇冗余值及占位列表优化咨询

斐波那契数列冗余值问题分析与优化

冗余值产生原因

你代码里的核心问题是重复存储数据:

  • 初始列表已经预先分配了10个位置(2个初始值+8个None占位),循环中你先给这些None的位置赋值,生成了正确的斐波那契数;
  • 但同时又调用list1.append(list1[i]),每次循环都把刚算出的值再添加到列表末尾,相当于把第3到第10项的数重复存了一遍,最终导致列表后半段出现冗余。
    另外,你写的循环范围range(2,11)存在索引越界风险:初始列表只有10个元素(索引0-9),当i=10时执行list1[i]会直接报错,你的输出没报错说明实际运行的循环范围应该是range(2,10)(对应8次循环,正好填满初始列表的None,同时append8次,导致多8个冗余值)。

解决方法

只需要保留「赋值填充预分配列表」或「动态append新增元素」其中一种逻辑即可,二选一:

方式1:填充预分配列表(去掉append)

调整循环范围到合法索引区间,删掉多余的append语句:

list1 = [0, 1, None, None, None, None, None, None, None, None]
for i in range(2, 10):
    list1[i] = list1[i-1] + list1[i-2]
print(list1)  # 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

方式2:动态生成列表(去掉预分配)

不需要预先占位,直接从初始值开始动态添加元素,代码更简洁:

list1 = [0, 1]
# 已有2个元素,需再生成8个凑够10项
for _ in range(8):
    next_num = list1[-1] + list1[-2]
    list1.append(next_num)
print(list1)

更优的列表占位方式

你用None做占位符是可行的,但有更灵活高效的选择:

  • 乘法批量生成:如果需要固定长度的占位列表,用乘法更简洁,比如生成包含2个初始值+8个None的列表:list1 = [0, 1] + [None] * 8,避免手动重复写None;
  • 动态生成(推荐):像方式2那样,完全不需要预分配占位符,通过append动态添加元素,既不会出现索引越界问题,代码也更易读;
  • 列表推导式:如果需要统一初始值的占位列表,比如用0填充:list1 = [0 for _ in range(10)],再修改前两个值为0和1即可,适合需要统一初始值的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:38