1

I am trying to find the determinant of a 4x4 matrix using nested list operations. I gave the following code

def determinant_4x4(matrix: list[list[int|float]]) -> float:
    # Your recursive implementation here
    def recursedet(matrix):
        if len(matrix) == 2: 
            return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
        
        sum = 0
        for i in range(len(matrix)):
            ele = matrix[0][i]

            del matrix[0]
            for row in matrix:
                del row[i]
            
            sum += ele*((-1)**i)*recursedet(matrix)
        
        return sum
    
    return recursedet(matrix)

But I am getting the error: IndexError: list index out of range

However, when I asked GPT to rectify this, it said that my code gave the same output as the rectified version but the matrix was corrupted. Can anybody help me understand what does this mean?

5
  • The main error is coming up in the part where I'm deleting the first row(matrix[0]) and then performing the del operation to remove a column Commented Mar 27 at 6:07
  • Welcome to Stack Overflow. Please include the full traceback error. Commented Mar 27 at 6:11
  • The issue that I find with respect to deleting items is that you need to keep track of the elements you delete; because you will eventually refer to matrix[0] and that won't exist if matrix is empty. Please do note that I haven't actually run your code. Just a note. Commented Mar 27 at 6:14
  • Is there a reason why you chose list[list[int|float] over a numpy array? Is this an assignment? Anyway, for a recursive determinant function I would rather slice the portions you need to pass into the recursion. Avoid to delete in-place, you are pulling the ground from your own feet. Commented Mar 27 at 6:44
  • @André yes, it is an assignment. Would be much easier with numpy for sure, but wanted to try it with lists for better understanding. Thanks! Commented Mar 27 at 7:49

1 Answer 1

2

The error occurs because your code is modifying the original matrix during the recursive calls, which leads to incorrect submatrix dimensions and eventually an IndexError.

Problems in your code are:

  1. del matrix[0] removes the first row permanently.

  2. del row[i] modifies each row, which reduces the matrix's width.

  3. Since you are not making a copy of matrix for each recursive call, it gets progressively smaller and incorrect.

Solution:

def determinant_4x4(matrix: list[list[int | float]]) -> float:
    def recursedet(matrix):
        if len(matrix) == 2:
            return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
        
        total = 0
        for i in range(len(matrix)):
            ele = matrix[0][i]

            # Create a minor matrix without modifying the original
            minor = [row[:i] + row[i+1:] for row in matrix[1:]]

            total += ele * ((-1) ** i) * recursedet(minor)

        return total
    
    return recursedet(matrix)

# Example usage
matrix_4x4 = [
    [2, 3, 1, 5],
    [1, 0, 2, 4],
    [3, 1, 4, 2],
    [2, 5, 3, 1]
]

print(determinant_4x4(matrix_4x4))
Sign up to request clarification or add additional context in comments.

1 Comment

I am glad to hear that this answer was helpful to you. If it successfully resolved your issue, kindly consider marking it as accepted by clicking the checkmark ✔ next to it. This will assist others who may encounter the same problem. Thank you. @ShreyasMishra

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.