Рекурсивные алгоритмы и функции - 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— макрос для добавления элемента в начало списка.