递归实现矩阵乘法器返回值仅保留首次迭代结果的问题及非全局变量解决方案咨询
嘿,我瞅见你这个递归矩阵乘法的问题了——返回值只保留首次迭代结果,确实是递归调用时没正确传递结果导致的,完全不用上全局变量,咱们来改改就行!
问题根源分析
你原来的代码里,当递归调用m_multiple(*storage)的时候,只是调用了函数但没把它的返回值存下来,最后返回的还是第一次循环计算出的result。比如你测试的x,y,z,a,递归到最后算出了正确的[[30],[30]],但这个结果没有传递回上层调用,最外层自然只能返回第一次算的[[10],[10]]。
解决方案1:重构为清晰的递归逻辑(推荐)
先写一个专门算两个矩阵相乘的辅助函数,这样递归逻辑会更直观,也容易维护:
def multiply_two(mat1, mat2): # 先做合法性检查,避免无效相乘 if len(mat1[0]) != len(mat2): raise ValueError("第一个矩阵的列数必须等于第二个矩阵的行数!") # 初始化结果矩阵 result = [[0 for _ in range(len(mat2[0]))] for _ in range(len(mat1))] # 矩阵乘法核心计算 for i in range(len(mat1)): for j in range(len(mat2[0])): for k in range(len(mat2)): result[i][j] += mat1[i][k] * mat2[k][j] return result def m_multiple(*args): # 处理边界情况:没传矩阵或只传了一个 if len(args) == 0: raise ValueError("至少得传入一个矩阵呀!") if len(args) == 1: return args[0] # 递归逻辑:先算前两个的乘积,再和剩下的矩阵继续相乘 first_product = multiply_two(args[0], args[1]) return m_multiple(first_product, *args[2:])
解决方案2:直接修改你原来的代码
如果你不想拆分辅助函数,只需要在递归调用时把结果赋值给result就行:
def m_multiple(*args): storage = [matrix for matrix in args] # 处理只有一个矩阵的情况 if len(storage) == 1: return storage[0] # 计算前两个矩阵的乘积 result = [[0 for _ in range(len(storage[1][0]))] for _ in range(len(storage[0]))] for row in range(len(storage[0])): for column in range(len(storage[1][0])): for row2 in range(len(storage[1])): result[row][column] += storage[0][row][row2] * storage[1][row2][column] # 递归处理剩余矩阵,关键:把递归结果赋值给result if len(storage) > 2: result = m_multiple(result, *storage[2:]) return result
测试一下
用你的示例代码测试,现在会输出正确的[[30], [30]]:
def main(): x = [[2, 2], [2, 2]] y = [[3], [2]] z = [[1, 2]] a = [[1], [1]] print(m_multiple(x, y, z, a)) # 输出 [[30], [30]] if __name__ == '__main__': main()
核心思路就是让递归调用的结果能沿着调用链传递回来,而不是只在递归内部计算完就丢了,完全不需要全局变量来存结果~
内容的提问来源于stack exchange,提问作者Zernoxi
相关产品推荐
相关产品推荐

