自顶向下(Top-down)动态规划实现结果与递归版本不符问题排查
问题根因
你的带记忆化的自顶向下实现计算结果错误,核心是边界判断顺序错误导致负数索引非法读取memo数组:
- 你初始化的memo数组仅支持非负索引,n的合法范围是
0到初始入参的n值,m的合法范围是0到初始入参的m值 - 递归分支中存在
n-m的参数传递,当n < m时n-m为负数,Python列表会将负索引解析为从数组末尾反向取值,此时你写在memo读取判断内部的n < 0分支根本不会触发,代码会直接读取memo中无关位置的存储值参与计算,最终结果失真。
以入参(4,4)为例,递归到n=1, m=4的分支时,n-m=-3,访问memo[-3][4]实际取到的是memo[2][4]的值,完全不符合n<0时返回0的基准规则,最终返回值从正确的5偏差为2。
修复方案
将所有边界判断移到memo数组访问逻辑之前,所有不满足合法索引要求的入参直接返回基准值,不进行缓存读写。修复后的内部实现函数代码如下:
def funct_top_down_imp(n, m, memo): # 优先处理边界条件,避免非法索引访问 if n == 0: return 1 if m == 0 or n < 0: return 0 # 仅当入参合法时查询/写入缓存 if memo[n][m] == -1: memo[n][m] = funct_top_down_imp(n-m, m, memo) + funct_top_down_imp(n, m-1, memo) return memo[n][m]
替换原有实现后测试(4,4)入参,返回值为5,和原始递归版本结果完全一致。
内容的提问来源于stack exchange,提问作者Iván
相关产品推荐
相关产品推荐

