(от PetrovP): В в каждой строке матрицы A присвоить элементу главной диагонали сумму положительных элементов с - Lisp
Формулировка задачи:
Задана матрица A размера 6*7 в каждой строке матрицы элементу главной диагонали присвоить сумму положительных элементов строки без элемента главной диагонали.
HomeLisp:
(defun task (matr)
(let ((res nil))
(iter (for row in matr)
(for p from 0 to (- (length matr) 1))
(let ((r nil)
(s 0))
(iter (for a in row) (for j from 0 to (- (length row) 1))
(when (and (plusp a) (/= j p)) (summing a into s)))
(setf (nth p row) s))
(collecting row into res)) res ))
==> task
(task '((1 2 3) (4 5 6) (7 8 9)))
==> ((5 2 3) (4 10 6) (7 8 15))Решение задачи: «(от PetrovP): В в каждой строке матрицы A присвоить элементу главной диагонали сумму положительных элементов с»
textual
Листинг программы
(define (matrix-diagonal-chg mtxk) (let matrix-diagonal-chg_ ((mtxk mtxk) (mtxc mtxk) (nrow 0) (mtxr '())) (cond ((empty? mtxc) mtxr) (else (define sumcol (let compute-sumcol ((mtxc mtxk) (ncol nrow) (jcol 0) (sumcol 0)) (cond ((empty? mtxc) sumcol) (else (define elmc (let select-elmc ((lstrow (car mtxc)) (ncol ncol) (jcol 0)) (cond ((empty? lstrow) 0) (else (cond ((= jcol ncol) (car lstrow)) (else (select-elmc (cdr lstrow) ncol (+ jcol 1))) ) ) ) ) ) (cond ((< elmc 0) (set! elmc 0)) ) (cond ((= jcol ncol) (set! elmc 0)) ) (compute-sumcol (cdr mtxc) ncol (+ jcol 1) (+ sumcol elmc)) ) ) ) ) (define lstrownew (let create-lstrow-new ((lstc (car mtxc)) (sumcol sumcol) (ncol nrow) (jcol 0) (lstrownew '())) (cond ((empty? lstc) lstrownew) (else (cond ((= jcol ncol) (set! lstrownew (append lstrownew (list sumcol)))) (else (set! lstrownew (append lstrownew (list (car lstc))))) ) (create-lstrow-new (cdr lstc) sumcol ncol (+ jcol 1) lstrownew) ) ) ) ) (set! mtxr (append mtxr (list lstrownew))) (matrix-diagonal-chg_ mtxk (cdr mtxc) (+ nrow 1) mtxr) ) ) ) )
Объяснение кода листинга программы
Код представлен на языке программирования Lisp. Он выполняет следующие действия:
- Получает на вход матрицу A и присваивает элементу главной диагонали сумму положительных элементов с главной диагонали.
- Для этого используется рекурсивная функция
matrix-diagonal-chg_, которая выполняет следующие действия:- Инициализирует переменные
mtxk,mtxc,nrowиmtxrзначением пустого списка. - Рекурсивно вызывает функцию
matrix-diagonal-chg_для каждого элемента матрицы, начиная с главной диагонали. - Для каждого элемента матрицы выполняет следующие действия:
- Проверяет, является ли текущий элемент положительным.
- Если текущий элемент положительный, то добавляет его в список
sumcol. - Если список
sumcolне пустой, то добавляет его в новый списокlstrownew. - Добавляет новый список
lstrownewв списокmtxr.
- Инициализирует переменные
- Выводит на экран список
mtxr, который содержит исходную матрицу A с измененными значениями.