Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 16
1

Список атомов. Написать программу, возвращающую список заданного вида

16.11.2012, 08:52. Просмотров 1950. Ответов 12
Метки нет (Все метки)


приветствую всех! очень нужно решить задачу, ну никак не идёт! заранее всем спасибо

Есть список атомов. Написать программу, возвращающую список вида: первый элемент — атом исходного списка, появляющийся в списке один раз, второй элемент — атом, появляющийся два раза и т.д. Если есть несколько атомов, появляющихся одинаковое количество раз, то их объединить в список
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2012, 08:52
Ответы с готовыми решениями:

Написать функцию, возвращающую список частот атомов, входящих в исходный список
Ребят, и еще одна задачка на написание функции. Написать функцию, возвращающую для заданного...

Написать программу, возвращающую список вида: первый элемент — атом исходного списка, появляющийся в списке один раз (с
Есть список атомов. Написать программу, возвращающую список вида: первый элемент — атом исходного...

Написать функцию, возвращающую список из n копий заданного атома x
В lisp'e совсем плох. Надо решить три задачки. Написать функцию: 1.Возвращающую список из n копий...

Написать программу, возвращающую список, содержащий информацию о количестве подсписков на каждом уровне вложенности
Пожалуйста подскажите, необходимо просто подсчитать кол-во букв или цифр, вообщем символов. здесь...

12
Модератор
Эксперт Python
28410 / 15303 / 3017
Регистрация: 12.02.2012
Сообщений: 25,054
Записей в блоге: 4
16.11.2012, 11:46 2
Вот развернутое решение:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;; подсчет числа вхождений атома в список
 
(defun cou (e lst)
  (cond ((null lst) 0)
        ((EQ e (car lst)) (+ 1 (cou e (cdr lst))))
        (t (cou e (cdr lst)))))
 
 
==> cou
 
(cou 1 '(1 2 1 2 3 1))
 
==> 3
 
;; построение пар ((атом число-вхождений))
 
(defun mkpair (x)
  (cond ((null x) nil)
        (t (cons (list (car x) (cou (car x) x)) (mkpair (remove (car x) x))))))
 
 
==> mkpair
 
(mkpair '(a b c a b c d))
 
==> ((a 2) (b 2) (c 2) (d 1))
 
;; сортировка списка пар
 
(defun msort (x) (COND ((NULL x) NIL) 
    (T (APPEND (msort (remove-if (FUNCTION (LAMBDA (z) (> (cadr z) (CADAR x)))) (CDR x))) 
               (LIST (CAR x)) 
               (msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)))))))
 
==> msort
 
(msort '((a 2) (b 2) (c 2) (d 1)))
 
 
==> ((d 1) (c 2) (b 2) (a 2))
 
;; объединение 
 
(defun merge (x &optional r)
  (cond ((null x) nil)
        ((= (length x) 1)
         (cond (r (append (list r) (list (caar x))))
               (t (list (caar x))) 
        ))
        ((= (cadar x) (cadadr x)) (merge (cdr x) (cons (caar x) r)))
        (r (append (list (cons (caar x) r)) (merge (cdr x) nil)))
        (t (append (list (caar x)) (merge (cdr x) nil)))))
 
==> merge
 
(merge '((a 2) (b 2) (c 2) (d 1)))
 
==> ((c b a) d)
 
;; Решение задачи
 
(defun task (x)
   (merge (msort (mkpair x))))
 
==> task
 
(task '(a b c a b c d e f h h h))
 
==> ((d e f) (a b c) h)
2
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 16
18.11.2012, 10:42  [ТС] 3
огромное спасибо!! просто таки от души!
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 28
31.10.2015, 13:43 4
Интерпретатор ругается на функцию merge. Скажите пожалуйста, как решить проблему?
Lisp
1
2
(PACKAGE-LOCK-VIOLATION #<PACKAGE "COMMON-LISP"> :SYMBOL MERGE :FORMAT-CONTROL "setting fdefinition of ~A" :FORMAT-ARGUMENTS (MERGE))
0]
0
4326 / 3335 / 339
Регистрация: 12.03.2013
Сообщений: 5,830
31.10.2015, 13:47 5
Нельзя переопределять стандартные символы из пакета "COMMON-LISP". Назовите по-другому.
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 28
31.10.2015, 14:52 6
В том случае, когда список имеет вид (A B C ()), интерпретатор выдает ответ: ((B C) A),
что не верно. я не очень разобралась еще в коде и не понимаю как исправить эту ошибку. Естественно ответ должен иметь вид: (A B C)
Буду благодарна, если поможете!
0
Модератор
Эксперт Python
28410 / 15303 / 3017
Регистрация: 12.02.2012
Сообщений: 25,054
Записей в блоге: 4
31.10.2015, 17:33 7
Katyakatch, какой код это выдает?
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 28
31.10.2015, 20:30 8
Ваш код. До исполнения merge, все нормально. Формируются пары и т. д.
Для этого примера: (print (task '(A A B B C C D E)))
Ответ такой: ((D E) (B C) A) , что тоже не правильно
0
Модератор
Эксперт Python
28410 / 15303 / 3017
Регистрация: 12.02.2012
Сообщений: 25,054
Записей в блоге: 4
03.11.2015, 18:00 9
Да, есть проблема. Придется переделать merge, добавить еще одну функцию finish и заменить task:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(defun merge (lst &optional (r nil) (p nil) (z nil))
   (cond ((null lst) (append r (list (append z (list (car p))))))
         ((null p) (merge (cdr lst) r (car lst) nil)) 
         ((= (cadr p) (cadar lst)) (merge (cdr lst) r (car lst) (cons (car p) z)))
         (t (if (null z) (merge (cdr lst) (append r (list (car p))) (car lst) nil)
                         (merge (cdr lst) (append r (list (cons (car p) z))) (car lst) nil)))))
 
(defun finish (lst)
  (mapcar #'(lambda (x) (cond ((atom x) x)
                              ((null (cdr x)) (car x))
                              (t x))) lst))
 
(defun task (x)
  (finish (merge (msort (mkpair x)))))
 
 
 (task '(A A B B C C D E))
 
==> ((d e) (b c a))
 
(task '(a b c a b c d e f h h h))
 
==> ((d e f) (a b c) h)
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 28
04.11.2015, 18:35 10
Спасибо! Последний вопрос по данной теме
Как переписать через хвостовую рекурсию? Пыталась разделить функцию на три отдельных, но успехом не увенчалось. Может подскажете?
Lisp
1
2
3
4
(defun msort (x) (COND ((NULL x) NIL) 
    (T (APPEND (msort (remove-if (FUNCTION (LAMBDA (z) (> (cadr z) (CADAR x)))) (CDR x))) 
               (LIST (CAR x)) 
               (msort (remove-if (FUNCTION (LAMBDA (z) (<= (cadr z) (CADAR x)))) (CDR x)))))))
0
Модератор
Эксперт Python
28410 / 15303 / 3017
Регистрация: 12.02.2012
Сообщений: 25,054
Записей в блоге: 4
04.11.2015, 20:07 11
Цитата Сообщение от Katyakatch Посмотреть сообщение
Как переписать через хвостовую рекурсию?
- какую именно функцию?
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 28
04.11.2015, 20:26 12
msort
0
Модератор
Эксперт Python
28410 / 15303 / 3017
Регистрация: 12.02.2012
Сообщений: 25,054
Записей в блоге: 4
04.11.2015, 20:57 13
Katyakatch, у меня нет уверенности, что это вообще возможно...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2015, 20:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Clojure Определить функцию, возвращающую список из n копий заданного атома x
Опpеделить функцию Возвращающую список из n копий заданного атома x. Например, x=4, n=5 –&gt; (4 4 4...

Clojure Определить функцию, возвращающую список из n копий заданного атома
продолжаю разбираться с этим языком, возникла трудность с этим заданием, кто что может подсказать?...

Написать функцию которая по линейныму списку вида (a d r g h .) строит сложный список вида (a (d (r (g (h (.)
Написать функцию которая по линейныму списку вида (a d r g h ...) строит сложный список вида (a (d...

Написать функцию которая по линейныму списку вида ( . a s w c b) строит сложный список вида (.) a) s) w) c) b)
Написать функцию которая по линейныму списку вида ( ... a s w c b) строит сложный список вида...

Программа, возвращающую список вида: первый элемент — атом, появляющийся в списке один раз, второй - два раза и т.д
Помогите пожалуйста!! Есть список атомов. Написать программу, возвращающую список вида: первый...

Clojure Написать функцию которая по линейныму списку вида (1 2 3 4 5) строит сложный список вида(1) (2) (3) (4) (5)
Здравствуйте. Помогите написать функцию которая по линейныму списку вида (1 2 3 4 5) строит сложный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.