Рекурсивные алгоритмы и функции - 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
— макрос для добавления элемента в начало списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д