n×n矩阵行列式计算程序运行异常,输入3×3矩阵触发索引错误
错误原因
- 循环重置矩阵后没有重新移除首行:你仅在
else分支开头执行了一次m.pop(0)移除首行,第一次循环结束后你将m重置为原始矩阵,后续循环没有重新移除首行,导致构造的子矩阵行数和列数不匹配,最终递归到2阶判断分支时,实际传入的是2行1列的矩阵,访问m[1][1]就会触发索引越界。 - 1阶矩阵返回值错误:1阶矩阵的结构是
[[x]],你当前返回m[0]得到的是列表[x]而非数值,后续计算会出现类型错误。
修复方案
- 把首行移除操作移到循环内部,每次重置矩阵后都重新执行
m.pop(0),保证待处理的子矩阵行数始终是n-1,行列数匹配。 - 修改1阶矩阵的返回值为
m[0][0],返回数值而非列表。
修复后的代码
import copy def matrixdeterminant(m): if len(m) == 1: # 修正1阶矩阵返回值 return m[0][0] elif len(m) == 2: return m[0][0] * m[1][1] - m[0][1] * m[1][0] else: matrixdeterminantlist = copy.deepcopy(m) determinantlist = [] for i in range(len(matrixdeterminantlist[0])): # 每次循环都重置矩阵并移除首行 m = copy.deepcopy(matrixdeterminantlist) m.pop(0) for j in range(len(m)): m[j].pop(i) determinantlist.append(matrixdeterminantlist[0][i] * matrixdeterminant(m) * (-1) ** (i + 2)) return sum(determinantlist)
内容的提问来源于stack exchange,提问作者Codingbeginner
相关产品推荐
相关产品推荐

