Почему переменная изменилась во время рекурсии (пытается вычислить матричный определитель) - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь вычислить определитель матрицы (основной порядок строк), используя простую рекурсию, но по какой-то причине переменная matrix изменилась во время последнего цикла, и я не понимаю, почему, потому что я не сделалt написать любой код, который вообще изменил значение переменной.

import math
def print_m(matrix):  # Print the matrix
    for i in range(len(matrix)):
        print(matrix[i])

def determinant(matrix):# return determinant assuming scanning through first row
    if len(matrix[0]) != len(matrix):
        print('Not square matrix')
        return None

    if len(matrix) == 2:
        print('LAST STEP EXECUTED')
        return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]

    def get_reduced_matrix(matrix, column):  #not responsible for changin sign
        newM = matrix[1:]
        for i in range(len(matrix) - 1):
            del newM[i][column]
        return newM

    output = 0
    for i in range(len(matrix)): #value of matrix changed when i turned into 1
        print("i =", i)
        print_m(matrix)
        print('END')
        output += matrix[0][i] * determinant(get_reduced_matrix(matrix, i)) * math.pow(-1, i + 1)  # change in sign at last
        print('Gonna do the loop again')
    return output



matrix1 = [
    [11, 12, 13],
    [21, 22, 23],
    [31, 32, 33]
]

print(determinant(matrix1))

output:

C:\Users\jason\Desktop\Python\venv\Scripts\python.exe C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py
i = 0
Traceback (most recent call last):
  File "C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py", line 38, in <module>
[11, 12, 13]
    print(determinant(matrix1))
[21, 22, 23]
[31, 32, 33]
  File "C:/Users/jason/.PyCharmCE2018.1/config/scratches/sdf.py", line 26, in determinant
end
    output += matrix[0][i] * determinant(get_reduced_matrix(matrix, i)) * math.pow(-1, i + 1)  # change in sign at last
LAST STEP EXECUTED
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType' #MATRIX LOST SOME OF ITS VALUE HERE
gonna do the loop again
i = 1
[11, 12, 13]
[22, 23]
[32, 33]
end
Not square matrix

Process finished with exit code 1

Таким образом, матрица просто потеряла свою первую запись в столбце во 2-й и 3-й строке, и яне знаю, что случилось вообще.Как я уже сказал, я не писал ни одного кода, который мог бы изменить значение matrix.

1 Ответ

0 голосов
/ 09 декабря 2018

Причина, по которой она изменяется, заключается в том, что матрица содержит ссылки на массивы, из которых состоят строки.

Если у вас есть матрица:

matrix1 = [
  [11, 12, 13],
  [21, 22, 23],
  [31, 32, 33]
]

, и вы берете фрагмент с:

newM = matrix[1:]

newM - это новая матрица, но она содержит ссылки на те же массивы строк, что и исходная матрица:

>> newM = matrix[1:]
>> newM[0] is matrix[1] # is it the same reference

True

Вам потребуется сделать более глубокую копиюстроки, если вы хотите манипулировать ими без изменения оригинала.Может быть, что-то вроде:

newM = [m[:] for m in matrix[1:]]

будет работать в этом случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...