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

Python递归记忆化求第N个斐波那契数报索引越界错误如何解决?

错误原因

  • 你在fibo函数中初始化的记忆数组a是空列表,Python的列表不允许直接访问超过当前长度的下标。当你传入n=2调用fibonaci时,函数第一时间会尝试访问memo[2],但空列表没有任何合法下标,直接触发IndexError。
  • 就算你给列表开了足够长度,也没有预先给所有位置填充初始值-1,后续判断memo[i]==-1的逻辑也无法正常生效。

修复方案

方案1:预初始化固定长度的记忆列表

修改fibo函数的记忆数组初始化逻辑,生成一个长度为n+1、所有元素初始值为-1的列表即可:

def fibonaci(i,memo):
    if i == 0 or i == 1:
       return i

    if memo[i]==-1:
       memo[i] = fibonaci(i-1,memo) + fibonaci(i-2,memo)

    return memo[i]

def fibo(n):
    # 初始化长度为n+1的列表,所有值默认填-1
    a = [-1]*(n+1)
    return fibonaci(n,a)

print(fibo(2))

运行后输出正确结果1。

方案2:用字典替代列表做记忆存储(更灵活)

如果不想提前计算列表长度,也可以用字典来存已经计算过的斐波那契值,不用处理预初始化的问题:

def fibonaci(i,memo):
    if i == 0 or i == 1:
       return i
    if i not in memo:
       memo[i] = fibonaci(i-1,memo) + fibonaci(i-2,memo)
    return memo[i]

def fibo(n):
    a = {}
    return fibonaci(n,a)

print(fibo(2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:03