Вычисление суммы диагоналей матрицы на Prolog

      Комментарии к записи Вычисление суммы диагоналей матрицы на Prolog отключены

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

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

    questioner
    Участник

    Требуется вычислить суммы элементов главной и побочной диагоналей квадратной матрицы на Prolog.

  • #2026

    У элементов главной диагонали индекс столбца совпадает с индексом строки.
    Матрица представлена списком списков – списком строк. Чтобы получить элемент на диагонали i-той строки – достаточно получить i-тый элемент соответствующего списка. Для получения элемента с заданным индексом можно использовать функцию nth0.

    main_diagonal_sum(Size, Size, _Matrix, 0):-!.
    main_diagonal_sum(Index, Size, [Row|TailRows], Sum):-
      NextIndex is Index + 1, 
      main_diagonal_sum(NextIndex, Size, TailRows, TailSum),
      nth0(Index, Row, Element), Sum is TailSum + Element.

    Функция перебирается строки матрицы до тех пор, пока не переберет их всех (значение индекса текущей строки не совпадет с их общим количеством). Для каждой строки вызывается функция nth0, полученное значение добавляется к результату рекурсивного вызова.

    Вычисление суммы элементов побочной диагонали выполняется аналогично, но индекс диагонального элемента в i-той строке определяется как n-i-1, где n – размер матрицы, i – индекс строки.

    second_diagonal_sum(Size, Size, _Matrix, 0):-!.
    second_diagonal_sum(Index, Size, [Row|TailRows], Sum):-
      NextIndex is Index + 1, 
      second_diagonal_sum(NextIndex, Size, TailRows, TailSum),
      ColumnIndex is Size - Index - 1, nth0(ColumnIndex, Row, Element), 
      Sum is TailSum + Element.

    Примеры использования функций:

    ?- second_diagonal_sum(0, 3, [[1,2,3],[4,5,6],[8,8,9]], Sum).
    Sum = 16.
    
    ?- main_diagonal_sum(0, 3, [[1,2,3],[4,5,6],[8,8,9]], Sum).
    Sum = 15.

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