递归质因数分解函数输出嵌套列表问题求助
解决递归质因数分解的嵌套列表问题
你的问题出在递归函数的逻辑设计上——你既在修改共享的列表r,又把这个列表本身作为返回值追加到了r里,这就导致了自引用的嵌套结构(也就是你看到的[...])。咱们一步步拆解问题,再给出修复方案:
问题根源分析
看你原来的代码片段:
r.append(getPrimeFactor(z[0],r)) r.append(getPrimeFactor(z[1],r)) return r
这里的问题有两个:
getPrimeFactor(z[0], r)已经会把z[0]的质因数添加到r里了,你却又把这个函数的返回值(也就是r本身)追加到了r中,相当于把列表自己塞了进去,自然会出现嵌套和自引用。- 每次递归都返回同一个
r对象,导致多次追加后,列表里充满了对自身的引用。
修复方案1:让递归返回质因数列表(更简洁)
重构函数逻辑,让递归函数直接返回当前数的质因数列表,通过列表拼接合并子问题的结果,不需要共享外部列表:
def getPrimeFactor(x): x = int(x) if is_Prime(x): return [x] # 获取最小的因数对 z = getLowestFactors(x) # 合并两个子数的质因数列表 return getPrimeFactor(z[0]) + getPrimeFactor(z[1]) # 调用示例 print(getPrimeFactor(3242)) # 输出 [2, 1621] print(getPrimeFactor(48)) # 输出 [2, 2, 2, 2, 3]
修复方案2:保留辅助列表(避免多次列表拼接)
如果你想继续用共享列表的方式优化性能(减少列表拼接的开销),只需要去掉对递归返回值的追加操作,让递归函数专注于把质因数添加到列表中即可:
def getPrimeFactorHelper(x): r = [] getPrimeFactor(x, r) return r def getPrimeFactor(x, r): x = int(x) if is_Prime(x): r.append(x) return # 不需要返回r,已经修改了传入的列表 z = getLowestFactors(x) # 直接递归处理两个子因数,结果会自动添加到r里 getPrimeFactor(z[0], r) getPrimeFactor(z[1], r) # 调用示例 print(getPrimeFactorHelper(3242)) # 输出 [2, 1621] print(getPrimeFactorHelper(48)) # 输出 [2, 2, 2, 2, 3]
这两种方案都能解决你遇到的嵌套列表问题,输出干净的质因数列表。
内容的提问来源于stack exchange,提问作者Shadows
相关产品推荐
相关产品推荐

