Выход за пределы списка C#

189
13 октября 2017, 13:13

Есть класс матрицы и метод, который возвращает определитель матрицы - Determinant. По неведомым причинам выходит за пределы двумерного списка. Сидим с друзьями, не можем понять почему так? Сам код:

    public class Matrix
    {
        public List<List<int>> columns = new List<List<int>> { };
       // List<int> row = new List<int> { };

        public void GenerateMatrix(int N) {
            Random random = new Random();
            List<int> row = new List<int> { };
            for (int i = 0; i < N; i++)
            {
                row = new List<int> { };
                for (int j = 0; j < N; j++)
                {
                    row.Add(random.Next(0, 10));
                }
                columns.Add(row);
            }
        }
        public List<List<int>> MatrixReturn() {
            return this.columns;
        }

        public double Determinant(Matrix matrix, int n)
        {
            Matrix mtr = new Matrix();
            mtr.GenerateMatrix(n-1);
            List<int> row = new List<int> { };
            mtr.columns = new List<List<int>> { };

            double det=0;
            if (n != 2)
            {
                for (int i = 0; i < n; i++)//large matrix
                {
                    mtr.columns = new List<List<int>> { };
                    for (int i1 = 0; i1 < n; i1++)//tiny matrix
                    {
                        row = new List<int> { };
                        for (int j = 0; j < n; j++)
                        {
                            if (i1 != 0 && j != i)
                                row.Add(matrix.columns[i1][j]);
                        }
                        mtr.columns.Add(row);
                    }
                     det += matrix.columns[0][i]*Math.Pow(-1, 1 + i) + Determinant(mtr, n - 1);
                }
                return det;
            }
            else
            {
                return det+ = matrix.columns[0][0] * matrix.columns[1][1] - matrix.columns[0][1] * matrix.columns[1][0];
            }
        }
    }
Answer 1

Вот это безусловное добавление

mtr.columns.Add(row);

в цикле

for (int i1 = 0; i1 < n; i1++)//tiny matrix

явно неправильное - в новую матрицу (минор) при i1 равном нулю попадает пустой row.

Потому и ошибка при последующем вызове Determinant - вылезание за границу пустого списка.

Привет друзьям.

READ ALSO
Восстановление слова

Восстановление слова

Добрый вечер - возможно ли с данного кода восстановить начальный string?

189
C# MySql Клиент-серверная архитектура как реализовать [требует правки]

C# MySql Клиент-серверная архитектура как реализовать [требует правки]

Я не понимаю как реализовать клиент-серверную архитектуру на C# и MySql ! Поможет ли это приложению повысить безопасность?

270