Посчитать количество повторяющихся элементов в массиве а - Lisp
Формулировка задачи:
(defun counter (y x) (cond ((null x) 0) ((eq y (car x)) (+ 1 (counter y (cdr x)))) (t (counter y (cdr x))))) (defun mkpair (x) (cond ((null x) nil) (t (append (list (list (car x) (counter (car x) x))) (mkpair (remove (car x) x)))))) (defun task (x) (mkpair (collect (flatten x)))) ==> task (task '(((2) -3 (4) 0 -2) ( -4 0 2) ((-3) (3)-4 3) )) ==> ((2 2) (-3 2) (4 1) (0 2) (-2 1) (-4 2) (3 2))
Решение задачи: «Посчитать количество повторяющихся элементов в массиве а»
(defun counter (y x) (cond ((null x) 0) ((eq y (car x)) (+ 1 (counter y (cdr x)))) (t (counter y (cdr x))))) (defun mkpair (x) (cond ((null x) nil) (t (append (list (list (car x) (counter (car x) x))) (mkpair (remove (car x) x)))))) (defun task (x) (mkpair (collect (flatten x)))) ;; Дополнительные функции (defun collect (L) (COND ((NULL L) NIL) (T (CONS (CAR L) (COLLECT (COND ((MEMBER (CAR L) (CDR L)) (CONS (CAR L) (REMOVEF (CAR L) (CDR L)))) (T (CDR L)))))))) (defun flatten (X) (COND ((NULL X) NIL) ((ATOM X) (LIST X)) (T (APPEND (FLATTEN (CAR X)) (FLATTEN (CDR X)))))) (defun removef (X Y) (COND ((NULL Y) NIL) ((EQUAL X (CAR Y)) (CDR Y)) (T (CONS (CAR Y) (REMOVEF X (CDR Y)))))) (task '(((2) -3 (4) 0 -2) ( -4 0 2) ((-3) (3)-4 3))) ==> ((2 2) (-3 2) (4 1) (0 2) (-2 1) (-4 2) (3 2))
Объяснение кода листинга программы
В этом коде реализованы две функции: counter
и mkpair
.
Функция counter
принимает два аргумента: y
и x
. Если x
— это nil
, то возвращается 0. Если y
равно первому элементу x
(то есть car x
), то возвращается 1
и функция вызывается рекурсивно для y
и cdr x
. В противном случае вызывается функция counter
для y
и cdr x
.
Функция mkpair
принимает x
в качестве аргумента. Если x
— это nil
, то возвращается nil
. Если x
— это не nil
, то возвращается результат вызова функции append
для списка, содержащего кортеж из car x
и результата вызова функции counter
для car x
и x
, и nil
.
Функция task
принимает x
в качестве аргумента и вызывает функцию mkpair
с аргументом collect(x)
, где collect
— это функция, которая принимает l
в качестве аргумента и возвращает список, содержащий car l
и результат вызова функции removef
для car l
и cdr l
.
Функция collect
принимает l
в качестве аргумента и возвращает список, содержащий car l
и результат вызова функции removef
для car l
и cdr l
. Если l
— это nil
, то возвращается nil
. Если l
— это не nil
, то возвращается cons(car l)(collect(cdr l))
.
Функция flatten
принимает x
в качестве аргумента и возвращает список, содержащий car x
и результат вызова функции flatten
для cdr x
. Если x
— это nil
, то возвращается nil
. Если x
— это атом, то возвращается список, содержащий x
. Если x
— это не nil
, то возвращается результат вызова функции append
для списка, содержащего car x
и cdr x
.
Функция removef
принимает x
и y
в качестве аргументов и возвращает список, содержащий car y
и результат вызова функции removef
для x
и cdr y
. Если y
— это nil
, то возвращается nil
. Если x
равно car y
, то возвращается cdr y
.
Вызов функции task
с аргументом '(((2) -3 (4) 0 -2) ( -4 0 2) ((-3) (3)-4 3))
возвращает список, содержащий 2 2 -3 4 0 -2 -4 0 2 -3 3
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д