Найти наибольший (наименьший) элемент диагоналей матрицы

      Комментарии к записи Найти наибольший (наименьший) элемент диагоналей матрицы отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Обработка матриц на Prolog Найти наибольший (наименьший) элемент диагоналей матрицы

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 11 мес. назад.

  • Автор
    Сообщения
  • #2014

    questioner
    Участник

    Помогите решить задачу на пролог:

    вычислить минимальное (максимальное) значение главной и побочный диагоналей матрицы

  • #2029

    Так как матрица представлена списком списков (списком строк), то для перебора элементов диагонали матрицы необходимо сначала извлечь i-тую строку, а затем получить элемент соответствующей диагонали (j-того столбца). Для главной диагонали j = i, для побочной j = n-i-1.

    main_diagonal_max(Index, [Row], Max):-
      !, nth0(Index, Row, Max).
    main_diagonal_max(Index, [Row|TailRows], Max):-
      TailIndex is Index + 1, 
      main_diagonal_max(TailIndex, TailRows, TailMax),
      nth0(Index, Row, RowMax),
      Max is max(RowMax, TailMax).

    Для получения элемента списка с заданным индексом используется встроенное правило nth0. Если матрица состоит из одной строки – то решение очевидно, иначе – выбирается диагональный элемент текущей строки, а остальная матрица обрабатывается рекурсивно. Из наибольшего элемента “хвоста матрицы” и максимума текущей строки формируется результат. Функция max является встроенной, но если в вашем диалекте (например Turbo Prolog) ее нет – можно реализовать самостоятельно:

    max(A, B, A):- A > B, !.
    max(_A, B, B).

    Для вычисления наибольшего элемента побочный диагонали на каждом шаге потребуется значение размера матрицы, либо можно изначально вычислить индекс диагонального элемента первой строки (n-1) и уменьшать его на каждом последующем шаге алгоритма.

    second_diagonal_max(Matrix, Max):-
      length(Matrix, Size), Index is Size - 1,
      second_diagonal_max(Index, Matrix, Max).
     
    second_diagonal_max(Index, [Row], Max):-
      !, nth0(Index, Row, Max).
    second_diagonal_max(Index, [Row|TailRows], Max):-
      TailIndex is Index - 1, nth0(Index, Row, RowMax),
      second_diagonal_max(TailIndex, TailRows, TailMax),
      Max is max(RowMax, TailMax).

    Для определения размера (количества строк) матрицы используется стандартная функция length. Поиск минимальных элементов будет выполняться аналогично.

Для ответа в этой теме необходимо авторизоваться.