Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
1

Описать функцию (частоты х)

25.11.2012, 11:55. Просмотров 1492. Ответов 22
Метки нет (Все метки)

Описать функцию (частоты х), которая берет в качестве аргумента список атомов х и выдает список всех атомов, встречающихся в х вместе с частотой их появления. Порядок расположения пар несущественен.
например
> (частоты ‘(a b a b a c a))
(( a 4) (b 2) (c 1))

>(частоты ‘(ни то ни другое))
((ни 2) (то 1) (другое 1))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2012, 11:55
Ответы с готовыми решениями:

описать функцию
y\, (N) = \sum \limits_{i=1}^{N}i! y\, (N) = \sum \limits_{i=1}^{N}\sum \limits_{j=1}^{N}(\lg \,...

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

Описать функцию в списке
Помогите написать программу на языке Lisp (я работаю в LispWorks Personal) Есть список lst и...

Нужно описать функцию
y(N)=\sum_{i=1}^{N}\sum_{j=1}^{N}(lg\, i+ln\, j)

Описать функцию (max1 x)
Указания к решению задачи. Списки, являющиеся аргументами функций, могут содержать подсписки....

22
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
25.11.2012, 13:56 2
для многоуровневого списка:
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun elm-freq (w)
  (mapcar #'(lambda (a) (list a (count a (flat w))))
          (delete-duplicates (flat w))))
 
> (elm-freq '(a ((a) (a (a)) b) (b (b) c) c))
((A 4) (B 3) (C 2))
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun xelm (w &optional ac &aux (a (car w)))
  (cond ((null w) (reverse ac))
        ((find a ac :key #'car) (xelm (cdr w) ac))
        ((xelm (cdr w) (cons (list a (count a w)) ac)))))
 
(defun elm-freq (w)
  (xelm (flat w)))
 
> (elm-freq '(a ((a) (a (a)) b) (b (b) c) c))
((A 4) (B 3) (C 2))
для одноуровневого списка:
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun xelm (w)
  (labels ((xlm (w ac)
             (cond ((null w) (reverse ac))
                   ((find (car w) ac :key #'car) (xlm (cdr w) ac))
                   ((xlm (cdr w) (cons (list (car w) (count (car w) w)) ac)))))) 
    (xlm w nil)))
 
> (xelm '(a b a b a c a))
((A 4) (B 2) (C 1))
> (xelm '(ni to ni to))
((NI 2) (TO 2))
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun xlm (w ac)
  (cond ((null w) (reverse ac))
        ((find (car w) ac :key #'car) (xlm (cdr w) ac))
        ((xlm (cdr w) (cons (list (car w) (count (car w) w)) ac)))))
 
(defun xelm (w)
  (xlm w nil))
 
> (xelm '(a b a b a c a))
((A 4) (B 2) (C 1))
> (xelm '(ni to ni to))
((NI 2) (TO 2))
1
Catstail
Модератор
24549 / 12465 / 2275
Регистрация: 12.02.2012
Сообщений: 20,236
25.11.2012, 20:55 3
Вот решение с ассоциативным списком:

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
;; Вспомогательная функция, сохраняющая в ассоциативном списке
;; частоты появлений атомов
 
(defun store (a asso-list)
  (let ((aa (assoc a asso-list)))
       (if (null aa) 
           (cons (cons a 1) asso-list)
           (cons (cons a (+ 1 (cdr aa))) (remove aa asso-list)))))
 
;; Решение:
 
(defun freq (lst &optional alist)
  (cond ((null lst) alist)
        ((atom (car lst)) (freq (cdr lst) (store (car lst) alist)))
        (t (freq (cdr lst) (freq (car lst) alist)))))
   
==> freq
 
(freq '(a b c a b c d))
 
==> ((d . 1) (c . 2) (b . 2) (a . 2))
 
(freq '(a (((b) c) a) b c d))
 
==> ((d . 1) (c . 2) (b . 2) (a . 2))
 
(freq '(ни то и ни другое))
 
==> ((другое . 1) (ни . 2) (и . 1) (то . 1))
Правда, возвращается список точечных пар, но суть та же...
0
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
25.11.2012, 21:27 4
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun xelm (w &aux (v (remove-duplicates w)))
  (loop for a in v collect (list a (count a w))))
 
(defun elm-freq (w)
  (xelm (flat w)))
 
> (elm-freq '(a ((a) (a (a)) b) (b (b) c) c))
((A 4) (B 3) (C 2))
1
25.11.2012, 21:27
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 19:35  [ТС] 5
а попроще можно? (defun flat (w &optional acc) опять же с одним аргументом нужно, и вот как то без этого (remove-duplicates w)
0
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
18.12.2012, 19:43 6
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun flat (w acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun xelm (w ac)
  (cond ((null w) (reverse ac))
        ((find (car w) ac :key #'car) (xelm (cdr w) ac))
        ((xelm (cdr w) (cons (list (car w) (count (car w) w)) ac)))))
 
(defun elm-freq (w)
  (xelm (flat w nil) nil))
 
> (elm-freq '(a ((a) (a (a)) b) (b (b) c) c))
((A 4) (B 3) (C 2))
1
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 19:48  [ТС] 7
((find (car w) ac :key #'car а теперь это неприемлемо для нашего уровня знаний, мы только примитивные коды пишем,

Добавлено через 3 минуты
а еще выравнивать списки не нужно (по условию)
0
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
18.12.2012, 19:50 8
member приемлемо?:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun flat (w acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))
 
(defun xelm (w ac)
  (cond ((null w) (reverse ac))
        ((member (car w) (flat ac nil)) (xelm (cdr w) ac))
        ((xelm (cdr w) (cons (list (car w) (count (car w) w)) ac)))))
 
(defun elm-freq (w)
  (xelm (flat w nil) nil))
 
> (elm-freq '(a ((a) (a (a)) b) (b (b) c) c))
((A 4) (B 3) (C 2))
0
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 19:56  [ТС] 9
member нет, неприемлемо, и возможно reverse, смотря зачем он нужен

Добавлено через 2 минуты
надо проще, всего 6 лабораторная
0
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
18.12.2012, 19:58 10
без выравнивания:
Lisp
1
2
3
4
5
6
7
8
9
10
(defun xlm (w ac m)
  (cond ((null w) (reverse ac))
        ((member (car w) m) (xlm (cdr w) ac m))
        ((xlm (cdr w) (cons (list (car w) (count (car w) w)) ac) (cons (car w) m)))))
 
(defun elm-freq (w)
  (xlm w nil nil))
 
> (elm-freq '(a a a a b b b c c))
((A 4) (B 3) (C 2))
0
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 19:59  [ТС] 11
опять с member?
0
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
18.12.2012, 20:06 12
со своей _member и без reverse:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun _member (a w)
  (cond ((null w) nil)
        ((eq (car w) a) (cons (car w) (cdr w)))
    ((member a (cdr w)))))
 
(defun xlm (w ac m)
  (cond ((null w) ac)
        ((_member (car w) m) (xlm (cdr w) ac m))
        ((xlm (cdr w) (cons (list (car w) (count (car w) w)) ac) (cons (car w) m)))))
 
(defun elm-freq (w)
  (xlm w nil nil))
 
> (elm-freq '(a a a a b b b c c))
((C 2) (B 3) (A 4))
1
korvin_
2490 / 1929 / 347
Регистрация: 28.04.2012
Сообщений: 6,600
18.12.2012, 20:09 13
Lisp
1
2
3
4
5
6
7
8
9
(defun frequency (list)
  (let ((cache  (make-hash-table :test #'eql))
        (result nil))
    (dolist (x list)
      (incf (gethash x cache 0)))
    (maphash #'(lambda (x freq)
                 (push (list x freq) result))
             cache)
    result))
1
_sg
4112 / 3860 / 292
Регистрация: 12.05.2012
Сообщений: 2,719
18.12.2012, 20:25 14
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun _member (a w)
  (cond ((null w) nil)
        ((eq (car w) a) (cons (car w) (cdr w)))
    ((_member a (cdr w)))))
 
(defun xlm (w ac m)
  (cond ((null w) ac)
        ((_member (car w) m) (xlm (cdr w) ac m))
        ((xlm (cdr w) (cons (list (car w) (count (car w) w)) ac) (cons (car w) m)))))
 
(defun elm-freq (w)
  (xlm w nil nil))
 
> (elm-freq '(a a a a b b b c c))
((C 2) (B 3) (A 4))
1
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 20:38  [ТС] 15
а можно с комментариями?
0
Catstail
Модератор
24549 / 12465 / 2275
Регистрация: 12.02.2012
Сообщений: 20,236
18.12.2012, 20:47 16
А вот такое решение:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun freq (lst)
  (let* ((alst (flatten lst))
         (aset (setof alst))
         (res nil)
         (k 0)) 
        (dolist (i aset res)
          (setq k 0)
          (setq res (append res (list
             (dolist (j alst (list i k))
               (when (EQ i j) (setq k (+ 1 k))))))))))
 
==> freq
 
(freq '(a s d a s d f))
 
==> ((a 2) (s 2) (d 2) (f 1))
1
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 20:48  [ТС] 17
не, это очень не просто, не по нашему
0
Catstail
Модератор
24549 / 12465 / 2275
Регистрация: 12.02.2012
Сообщений: 20,236
18.12.2012, 21:00 18
Lisp
1
2
3
4
5
6
7
8
9
10
(defun freq (lst)
  (let* ((alst (flatten lst)) ;; удаляем скобки
         (aset (setof alst)) ;; берем уникальный набор атомов
         (res nil) ;; здесь будет результат
         (k 0))  ;; счетчик
        (dolist (i aset res) ;; цикл по списку атомов
          (setq k 0) ;; k=0
          (setq res (append res (list ;; к результату присоединим пару (атом число-вхождений)
             (dolist (j alst (list i k)) ;; цикл по исходному списку без скобок.
               (when (EQ i j) (setq k (+ 1 k)))))))))) ;; при встрече атома i увеличиваем счетчик...
Практически - тот же Паскаль...
0
Татьянна
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 60
18.12.2012, 21:02  [ТС] 19
да я понимаю, но с нас требуют то, что дают, а за полтора часа много не расскажешь.
0
korvin_
2490 / 1929 / 347
Регистрация: 28.04.2012
Сообщений: 6,600
18.12.2012, 21:14 20
Нее, вот так паскаль:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun freq (lst)
  (let (alst aset res k) ; var
    (setf alst (flatten lst))
    (setf aset (setof  alst))
    (setf res nil)
    (loop for set = aset then (cdr set) do
      (setf k 0)
      (loop for lst = alst then (cdr lst) do
        (when (eql (car set) (car lst))
          (incf k)))
      (push (list (car set) k) res))
    (nreverse res)))
=)
1
18.12.2012, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2012, 21:14

Описать функцию (уникум x)
Списки, являющиеся аргументами функций, могут содержать подсписки. Рекурсия распространяется как в...

Описать функцию, выполняющую обработку
Здравствуйте! Помогите пожалуйста сделать задание в Lisp. Есть список, содержащий атомы и списки,...

Описать функцию одного аргумента L
кто хорошо юзает лисп?? помогите пожалуйста!)) буду очень благодарен!!! 1) Описать функцию...


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

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

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