Прежде всего реализация матрицы с использованием списка списков неэффективна, если вам нужен произвольный доступ, потому что это будет стоить O(n + m)
вместо более дешевого O(1)
с использованием двумерного массива.
Чтобы проверить симметрию, прежде всего убедитесь, что матрица квадратная, а затем вам просто нужно проверить, что элемент m_ij
равен элементу m_ji
для всех пар.
Так как вам нужно проверить все пары на симметрию, имеет смысл рассмотреть только i > j
, чтобы не выполнять каждый тест дважды (>
, а не >=
, потому что явно m_ii
равен самому себе).
В качестве дополнительного бонуса проверка на симметрию не требует учета основных диагональных элементов.
(defun symmetric (m)
(let ((rows (array-dimension m 0))
(cols (array-dimension m 1)))
(when (= rows cols)
(dotimes (i rows T)
(dotimes (j i)
(unless (= (aref m i j) (aref m j i))
(return-from symmetric NIL)))))))
(let ((m (make-array (list 5 5) :initial-element 0)))
(dotimes (i 5)
(dotimes (j 5)
(setf (aref m i j) (* (1+ i) (1+ j)))))
(print m)
(print (symmetric m))
(setf (aref m 3 2) 9)
(print m)
(print (symmetric m)))