Рекурсивные алгоритмы и функции - Lisp
Формулировка задачи:
Добрый вечер Помогите. Желательно на XLisp-е
Пусть даны две матрицы A(m*n),B(m*n), состоящие из вещественных чисел. Необходимо получить матрицу C(m*n), где элемент Ci,j равен сумме элементов i-й строки матрицы A, которые отсутствуют в j-м столбце матрицы B. Напишите функцию вычисления Ci,j, использующую функцию проверки наличия числа в j- столбце матрицы B.
Скорей всего в HomeLisp только пол-ся)
Решение задачи: «Рекурсивные алгоритмы и функции»
textual
Листинг программы
- (defun get-row (x n) (car (subseq x (1- n) n)))
- (defun transp (x)
- (apply 'mapcar (cons 'list x)))
- (defun get-col (x n) (get-row (transp x) n))
- (defun diff-set (a b)
- (let ((r nil))
- (dolist (i a r) (when (not (member i b)) (push i r)))))
- (defun task (a b)
- (let ((m (length a))
- (n (length (car a)))
- (r nil)
- (c nil))
- (dotimes (i m c)
- (setq r nil)
- (dotimes (j m t)
- (setq r (append r (list (apply '+ (diff-set (get-row a (+ i 1)) (get-col b (+ j 1))))))))
- (setq c (append c (list r))))))
- (defmacro push (a s) `(setq ,s (cons ,a ,s)))
Объяснение кода листинга программы
Код решает задачу нахождения разности множеств строк таблицы и состоит из следующих функций:
get-row
— принимает два аргумента:x
иn
. Вспомогательная функция для полученияn
-й строки из таблицыx
.transp
— принимает один аргумент:x
. Функция для транспонирования таблицыx
.get-col
— принимает два аргумента:x
иn
. Вспомогательная функция для полученияn
-го столбца из таблицыx
.diff-set
— принимает два аргумента:a
иb
. Функция для нахождения разности множествa
иb
.task
— принимает два аргумента:a
иb
. Главная функция, которая рекурсивно обходит таблицу и находит разность множеств строк.push
— макрос для добавления элемента в начало списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д