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.
JavaScript
x
28
28
1
def la_place(matrix):
2
if len(matrix) == 2:
3
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
4
5
g = -1
6
det = 0
7
for i in range(len(matrix)):
8
g *= -1
9
var = scale_down(matrix, i)
10
det += g*matrix[0][i]*la_place(var)
11
return det
12
13
14
def scale_down(matrix, i):
15
var = matrix
16
if len(var) > 2:
17
var.pop(0)
18
for x in range(len(var)):
19
var[x].pop(i)
20
return var
21
22
23
24
a = [[1, 2, 3],
25
[4, 5, 6],
26
[7, 8, 9]]
27
print(la_place(a))
28
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 3×3 matrix. That was my original idea.
Advertisement
Answer
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:
JavaScript
1
35
35
1
import copy
2
3
4
def la_place(matrix):
5
var = copy.deepcopy(matrix)
6
if len(var) == 2:
7
return var[0][0] * var[1][1] - var[0][1] * var[1][0]
8
9
g = -1
10
det = 0
11
12
for i in range(len(var)):
13
g *= -1
14
det += g * matrix[0][i] * la_place(scale_down(var, i))
15
return det
16
17
18
def scale_down(matrix, i):
19
var = copy.deepcopy(matrix)
20
if len(var) > 2:
21
var.pop(0)
22
for x in range(len(var)):
23
var[x].pop(i)
24
return var
25
26
27
a = [[9, 4, 2, 1, 1, 7],
28
[1, 3, 2, 2, 2, 5],
29
[9, 9, 9, 3, 3, 6],
30
[9, 9, 9, 4, 5, 7],
31
[1, 2, 3, 5, 4, 5],
32
[2, 6, 7, 9, 4, 1]]
33
print(la_place(a))
34
35