Вычисление детерминанта матриц на основе рекурсивного алгоритма - C (СИ)
Формулировка задачи:
Помогите с написанием программы для вычисления детерминанта матриц на основе рекурсивного алгоритма.
Находил подобную программу на Delphi, Pascal и отрывками на C++, а вот на С нету
Решение задачи: «Вычисление детерминанта матриц на основе рекурсивного алгоритма»
textual
Листинг программы
- #include <conio.h>
- #include <stdio.h>
- #define n 4
- int main (void)
- {
- int Minor (int *ptr, int *ptr2, int nn, int row, int col);
- long int Determinant (int *ptr, int nn);
- long int det;
- //int i, j;
- int M[n][n] = {
- {3, 5, 7, 8},
- {-1, 7, 0, 1},
- {0, 5, 3, 2},
- {1, -1, 7, 4}
- };
- int *ptr;
- ptr = &M[0][0];
- det = Determinant (&M[0][0], n);
- printf("\n\t Determinant = %d", det);
- printf("\n\n Press any key: ");
- _getch();
- return 0;
- }
- int Minor (int *ptr, int *ptr2, int nn, int row, int col)
- {
- int ki, kj, di = 0, dj;
- for (ki = 0; ki < nn - 1; ki++)
- {
- if (ki == row)
- di = 1;
- dj = 0;
- for (kj = 0; kj < nn - 1; kj++)
- {
- if (kj == col)
- dj = 1;
- *(ptr2 + ki*nn + kj) = *(ptr +(ki + di)*nn + (kj + dj));
- }
- }
- }
- long int Determinant (int *ptr, int nn)
- {
- long int i, j, d = 0, k = 1;
- int R[n][n] = {0};
- int *ptr2, **ptr3;
- ptr2 = &R[0][0];
- ptr3 = &ptr;
- if (nn < 1)
- return 1;
- else if (nn == 1)
- d = *ptr;
- else if (nn == 2)
- d = *ptr * *(ptr + nn + 1) - *(ptr + nn) * *(ptr + 1);
- else
- for (i = 0; i < nn; ++i)
- {
- Minor (*ptr3, &R[0][0], nn, i, 0);
- d += k * *(ptr + i*nn) * Determinant (&R[0][0], nn - 1);
- k = -k;
- }
- return d;
- }
Объяснение кода листинга программы
В этом коде реализован алгоритм вычисления определителя матрицы. Определитель вычисляется путем последовательного применения операций элементарного преобразования матрицы. Список действий:
- Ввод матрицы M. Матрица M размером 4x4 заполняется значениями.
- Вычисление определителя. Вызывается функция Determinant, которая возвращает определитель матрицы.
- Вывод определителя. Результат вычисления определителя выводится на экран.
- Ввод ключа. Программа ожидает нажатия любой клавиши, чтобы продолжить выполнение. Функция Minor используется внутри функции Determinant и рекурсивно вызывает себя для вычисления миноров матрицы R. Вот список действий в функции Determinant:
- Базовый случай. Если размер матрицы меньше или равен 1, то определитель равен 1.
- Случай размера 2. Если размер матрицы равен 2, то определитель вычисляется как произведение диагональных элементов матрицы.
- Рекурсивный случай. Если размер матрицы больше 2, то для каждого элемента в первом столбце матрицы R вызывается функция Minor, которая вычисляет минор этого элемента.
- Сложение и умножение. К полученному значению d добавляется произведение текущего элемента матрицы и определителя матрицы R, уменьшенного на 1.
- Меняем знаки. Знак k меняется на противоположный, чтобы обеспечить циклическое перебор строк.
- Рекурсивный вызов. Вызывается рекурсивный случай для следующей строки.
- Возврат результата. Результат вычисления определителя возвращается из функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д