Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
IamLie
1 / 1 / 0
Регистрация: 25.12.2013
Сообщений: 15
1

Выделения атомов

25.06.2014, 18:03. Просмотров 1009. Ответов 2
Метки нет (Все метки)

Доброго времени суток, прошу помочь с задачей.

Написать программу выделения атомов в заданном интервале уровней в произвольном введенном исходном списке. Сформировать из них список и вывести его. Атомы, содержащиеся в исходном списке имеют уровень 0, атомы, содержащиеся в следующем вложенном списке, имеют уровень 1 и т.д.
Пример. Пусть имя программы p1, допустим, набрали исходный список
( a (b (c 1)d e) f ( (2 (g ) ) 3) ).
1 2 3 2 1 2 3 4 3 2 1 0
Тогда при обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 0 1) она выведет на экран сообщение “Список атомов с 0-го по 1-й уровни (a f b d e 3)”. При обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 1 2) она выведет на экран сообщение “Список атомов c 1-го по 2-й уровни (b d e c 1 3 2)”. При обращении к программе (p1 '(a(b(c 1)d e)f((2(g))3)) 2 3) она выведет на экран сообщение “ Список атомов со 2-го по 3-й уровни (с 1 2 g)”.

Мои наработки:
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
(defun p1(x1 N2 N1 )
 (setq l3 ())
 (p2 x1 N2 N1 0)
 (princ "Список атомов ")
 (princ N1)
 (princ "–го уровня - ")
 (princ l3)
 (terpri)
)
 
(defun p2 (x S N CL)
 (if (and(>=CL S)(<= CL N))
  (dolist (y x)
   (if (listp y)
    (progn
    (setq CL1 (1+ CL))
    (p2 y S N CL1)
    )
   )
   (if (and(atom y)(= CL N))
    (setq l3(cons y l3))
   )
  )
 )
)
 
;(load "d:\\C1\\lab_22.lisp")
;(p1 '(a(b(c 1)d e)f((2(g))3)) 1)
;(load "C:\\Program Files\\clisp-2.49\\lab_22.lisp")
;   (p1 '(a(b(c 1)d e)f((2(g))3)) 0 1)   (a f b d e 3)
;   (p1 '(a(b(c 1)d e)f((2(g))3)) 1 2)   (b d e c 1 3 2)
;   (p1 '(a(b(c 1)d e)f((2(g))3)) 2 3)    (с 1 2 g)
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 18:03
Ответы с готовыми решениями:

Написать программу выделения атомов в заданном интервале уровней
Написать программу выделения списков атомов в заданном интервале уровней в произвольном введенном...

Получить из списка произвольных атомов список атомов, которые в исходном списке встречаются один раз
Построить список атомов, которые встречаются в заданном списке ровно один раз.

Список атомов
Постройте функцию, которая заданному списку выдаст список входящих в него и в его подсписки атомов,...

Списки свойств атомов
Для реализации записей использовать списки свойств атомов. Составить программу определения...

Формирование списка атомов
Добрый день!Помогите пожалуйста решить задачу на LISP. Написать программу формирования списка,...

2
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
25.06.2014, 19:15 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;; racket lang [url]http://racket-lang.org[/url]
(define (foo lst low high n acc)
  (cond [(< n low) 
         (map (lambda (i) (foo i low high (add1 n) acc)) (filter pair? lst))]
        [(> n high) acc]
        [(list (filter (lambda (i) (not (pair? i))) lst)
               (map (lambda (i) (foo i low high (add1 n) acc))
                    (filter pair? lst)))]))
 
(define (task lst low high) 
  (append (flatten (foo lst low high 0 null))
          (range low (add1 high))))
 
(task '(a (b c) (d e (f g) h) i) 1 2)
;'(b c d e h f g 1 2)
1
Catstail
Модератор
24410 / 12346 / 2244
Регистрация: 12.02.2012
Сообщений: 20,061
25.06.2014, 20:08 3
Лучший ответ Сообщение было отмечено IamLie как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun get-atoms (lst b e &optional r)
 (cond 
   ((null lst) r)
   ((minusp e) r)
   ((and (zerop b)(>= e 0)(atom (car lst))) (get-atoms (cdr lst) 0 e (append r (list (car lst)))))
   ((and (zerop b)(> e 0))(get-atoms (cdr lst) 0 e (append r (get-atoms (car lst) 0 (- e 1) nil)))) 
   ((and (plusp b) (atom (car lst))) (get-atoms (cdr lst) b e r))
   ((and (plusp b)) (get-atoms (cdr lst) b e (append r (get-atoms (car lst) (- b 1) (- e 1) nil))))
   (t (get-atoms (cdr lst) b e (append r (get-atoms (car lst) 0 (- e 1) nil))))))
 
==> get-atoms
 
(get-atoms '(a (b (c 1) d e) f ((2 (g)) 3)) 0 1)
 
==> (a b d e f 3)
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 20:08

Подсчёт чисел и атомов
Всем добрый день!!! Помогите пожалуйста, кто сможет! Нужно написать на Лиспе функцию(рекурсивно)...

Перестановка атомов списка
Здравствуйте! помогите пожалуйста написать функцию перестановки атомов верхнего уровня и нижнего...

Проверка на количество атомов
Помогите как сделать подобное? Работаю HomeLisp то есть вначале идет любое аритмическое действие а...


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

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

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