Посчитать количество повторяющихся элементов в массиве а - Lisp

Узнай цену своей работы

Формулировка задачи:

где ошибка? почему компилятор пишет : $clisp main.lisp timeout: failed to run command ‘clisp’: No such file or directory как привести код в рабочее состояние?
(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))

Решение задачи: «Посчитать количество повторяющихся элементов в массиве а»

textual
Листинг программы
(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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы