I'm trying to write a function that calculates the determinant of a square matrix using recursion.
The parameter of the oldest function - the first one called - changes to the matrix returned by scale_down() and I don't know why.
def la_place(matrix):
if len(matrix) == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
g = -1
det = 0
for i in range(len(matrix)):
g *= -1
var = scale_down(matrix, i)
det = g*matrix[0][i]*la_place(var)
return det
def scale_down(matrix, i):
var = matrix
if len(var) > 2:
var.pop(0)
for x in range(len(var)):
var[x].pop(i)
return var
a = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print(la_place(a))
I tried substituting "matrix" with "var" in order not to use it directly, but it amounted to nothing.
The code would work fine, I think, if after every for loop iteration in the oldest la_place call, the parameter "matrix" would still equal the original 3x3 matrix. That was my original idea.
CodePudding user response:
I figured it out. It turns out that var = matrix does not make var independent of matrix. I imported the "copy" library and used var = copy.deepcopy(matrix) to make var independent of matrix. Here is the solution:
import copy
def la_place(matrix):
var = copy.deepcopy(matrix)
if len(var) == 2:
return var[0][0] * var[1][1] - var[0][1] * var[1][0]
g = -1
det = 0
for i in range(len(var)):
g *= -1
det = g * matrix[0][i] * la_place(scale_down(var, i))
return det
def scale_down(matrix, i):
var = copy.deepcopy(matrix)
if len(var) > 2:
var.pop(0)
for x in range(len(var)):
var[x].pop(i)
return var
a = [[9, 4, 2, 1, 1, 7],
[1, 3, 2, 2, 2, 5],
[9, 9, 9, 3, 3, 6],
[9, 9, 9, 4, 5, 7],
[1, 2, 3, 5, 4, 5],
[2, 6, 7, 9, 4, 1]]
print(la_place(a))