С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 13.05.2012
Сообщений: 16

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

17.03.2013, 23:55. Показов 3268. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу для выделения списков в заданном интервале в произвольно введенном исходном списке.
Сформировать их них список и вывести его. Исходный список имеет уровень 0, вложенный список имеет уровень 1 и т.д.
Пример.
(a(b(с 1)d e)f((2(g))3))
с 2-3 уровни ((с 1)(2(g))(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
(defun p1 (L N)
(setq Rez ())
(dolist (L1 L)
(if (and (listp L1) (= N 0))
(setq Rez (append Rez (cons L1 ())))
)
(if (and (listp L1) (> N 0))
(progn
(setq TU 0)
(setq Rez (p2 L1 N Rez TU))
)
)
)
(princ Rez)
)
(defun p2 (L1X NX RezX TUX)
(setq TUX (1+ TUX))
(dolist (L1X1 L1X)
(progn
(if (and (listp L1X1) (= TUX NX))
(setq RezX (append RezX (cons L1X1 ())))
)
(if (listp L1X1)
 (p2 L1X1 NX RezX TUX)
)
)
)
(return-from p2 RezX)
)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2013, 23:55
Ответы с готовыми решениями:

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

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

Написать функцию , которая строит список элементов, стоящих в исходном списке на четных местах
Написать функцию , которая строит список элементов, стоящих в исходном списке на четных местах

27
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 01:19
Nsity, пока вам не написали решение, я подкину вам идею, чтобы вы смогли попробовать собственные силы. Здесь можно написать очень компактную функцию.

Пусть l и n - границы, как в ваших обозначениях.

Если l > n или n < 0 - прекрасно, решений нет. (В задаче целесообразно допускать и отрицательные значения для границ.)

Нормальный случай: n < l, l >= 0. Здесь можно мыслить так: пройтись по элементам списка, и если элемент сам является спискам, применить к нему ту же функцию, но с параметрами n - 1 и l - 1. То есть спускаясь к подсписку, нас снова интересуют его подсписки, но поскольку глубина увеличилась на единицу, то интересуют подсписки на единицу меньшей глубины. Вроде несложная идея.

Плюс: к результату нужно присоединить сам список, если 0 <= n <= 1.

Попробуйте написать. Это несложно: проглядывают cond и рекурсия.

Добавлено через 11 минут
И пара стилистических замечаний.

Во-первых и в главных! Соблюдайте индентацию. Человек воспринимает структуру лиспокода по отступам. Очень грубо говоря: 1) вложенный блок сдвигается на две позиции; 2) аргументы функции - друг под другом. На самом деле все пользуются специальными средами разработки навроде LispBox, которые форматируют код автоматически.

Во-вторых, не выделяйте отдельную строку для закрывающих скобок, это не принято. (Человек воспринимает структуру лиспокода по отступам, а не по скобкам.)

В-третьих, пишите символы маленькими буквами. Это обычное соглашение: человек пишет Лиспу маленькими, Лисп отвечает большими.

Что касается самого кода. Я как член setf-лагеря говорю вам: во всех случаях используйте для присваивания setf, не прогадаете! А вообще, не злоупотребляйте присваиванием. Потренируйтесь писать функции в функциональном стиле (живут же люди вообще без присваиваний!), вы увидите, что нужда в присваивании появляется не так часто. Конечно, на Лиспе можно писать и так и сяк и наперекосяк - как фантазия позволяет; так развивайте же фантазию, а не зацикливайтесь на паскалеподобном коде.

Добавлено через 7 минут
Замеченные опечатки:

Цитата Сообщение от helter Посмотреть сообщение
Нормальный случай: n < l, l >= 0.
l < n

Цитата Сообщение от helter Посмотреть сообщение
Плюс: к результату нужно присоединить сам список, если 0 <= n <= 1.
0 <= l <= n
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:07
Цитата Сообщение от Nsity Посмотреть сообщение
Написать программу для выделения списков в заданном интервале в произвольно введенном исходном списке.
Сформировать их них список и вывести его. Исходный список имеет уровень 0, вложенный список имеет уровень 1 и т.д.
Пример.
(a(b(с 1)d e)f((2(g))3))
с 2-3 уровни ((с 1)(2(g))(g))
Некорректно сформулировано задание - вернуть подсписки определенного диапазона уровней вложенности, поскольку подсписки верхней границы диапазона включают в себя все свои подсписки. Вероятно, правильно - элементы заданного диапазона уровней вложенности. В последнем случае подсписки (элементы) тоже будут разрушены. Неправильно задавать диапазон в отношении подсписков, только в отношении атомов. По отношению к подспискам достаточно задать уровень вложенности.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:08
Что-то в два ночи некорректность ускользает от меня. Мы же не лезем в структуру подсписков, мы просто сами подсписки собираем.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:11
Как подсписки могут быть собраны без своих элементов (подсписков)?

Добавлено через 1 минуту
Вроде, нижняя граница диапазона, по условию должна их отрезать.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:11
А чем вам не нравится тестовый пример? Там и список, и подсписок.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:13
Цитата Сообщение от Nsity Посмотреть сообщение
с 2-3 уровни
со второго по третий уровень, нет?

Добавлено через 35 секунд
тем, что в тестовом примере нет уровней ниже третьего
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:14
(c 1), (2 (g)) - второй
(g) - третий
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:16
или, я неправильно понял условие, и диапазон не задается?

Добавлено через 1 минуту
а если бы был четвертый, то он дожен быть отрезан, нет?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:16
Моя супер-прога:
Lisp
1
2
CL-USER> (lists-inside '(a (b (c 1) d e) f ((2 (g (h))) 3)) 2 3)
((G (H)) (2 (G (H))) (C 1))
И я с ней согласен.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:19
можно не задавать третий, если глубже третьего нет

Добавлено через 2 минуты
(h) - четвертый
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:20
(h) - четвёртый, но он и не входит в список-ответ.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:24
что вернет (lists-inside '(a (b (c 1) d e) f ((2 (g ((h)))) 3)) 2 3)) ?

Добавлено через 1 минуту
((G (H)) (2 (G (H))) (C 1))

Добавлено через 2 минуты
в Вашем примере, (h) - третий, h - четвертый
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:27
Я спросил Оракул:
Lisp
1
2
CL-USER> (lists-inside '(a (b (c 1) d e) f ((2 (g ((h)))) 3)) 2 3)
((G ((H))) (2 (G ((H)))) (C 1))
Цитата Сообщение от _sg Посмотреть сообщение
((G (H)) (2 (G (H))) (C 1))
Так это не элемент списка-ответа, а внутренность одного из элементов. В списке-ответе ровно три элемента:
(G (H))
(2 (G (H)))
(C 1)

Добавлено через 2 минуты
Цитата Сообщение от _sg Посмотреть сообщение
в Вашем примере, (h) - третий, h - четвертый
По-моему, (h) - четвёртый, h - пятый.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:28
(lists-inside '(a (b (c 1) d e) f ((2 (g ((h)))) 3)) 2 3) - тогда зачем задан последний параметр?

Добавлено через 1 минуту
если берутся все вложенные, хоть до 7 уровня, хоть до 100 уровня?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:33
Nsity, ещё вам пара хинтов:
1) Форма с if является выражением, которое возвращает значение. Часть "иначе" обязательна (иначе что возвращать иначе?).
2) dolist не требует progn.

Добавлено через 1 минуту
Все вложенные не выписываются в окончательный ответ. Смотрите:
Цитата Сообщение от helter Посмотреть сообщение
Так это не элемент списка-ответа, а внутренность одного из элементов. В списке-ответе ровно три элемента:
(G (H))
(2 (G (H)))
(C 1)
список (h) не попадает в ответ.
0
 Аватар для _sg
4706 / 4401 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
18.03.2013, 02:38
тогда неизбежны повторы, задваивание, затраивание элементов, возможно корректно в диапазоне было бы искать не подписки или элементы, а атомы

Добавлено через 37 секунд
задание ради задания
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.03.2013, 02:42
А, вы насчёт ((a) ((a)) (((a)))), где (a) может быть выведено до трёх раз? Ну да, так. (Математически элегантно было бы привязать к каждому элементу ответа его "адрес" в дереве, ну да не требуется и слава богу.)
0
1 / 1 / 0
Регистрация: 13.05.2012
Сообщений: 16
18.03.2013, 09:52  [ТС]
helter,
Попыталась что-то сделать по вашим рекомендациям, но теперь выводит просто список списков всех уровней. Не понимаю, как за границы интервала не выходить.
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 p1 (L N1 N2)
  (setq Rez ())
  (dolist (L1 L)
    (if (and (listp L1) (= N1 0))
      (progn 
      (setq Rez (append Rez (cons L1 ())))
      (setq Rez (p2 L1 N1 N2 Rez))
      )
    )
    (if  (and (listp L1) (> N1 0))
      (progn
      (setq N1 (1- N1) N2 (1- N2))
      (setq Rez (p2 L1 N1 N2 Rez))
      )
    )
  ) 
  (princ Rez)
)
(defun p2 (L1X N1X N2X RezX)
  (dolist (L1X1 L1X)
    (if   (listp L1X1)
      (progn 
      (setq RezX (append RezX (cons L1X1 ())))
      (p2 L1X1 N1X N2X RezX)
    )
  )
  )
  (return-from p2 RezX)
)
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
18.03.2013, 12:30
Вот:

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
(defun lst-lv (lst n1 n2)
  (let ((s nil) (res nil) (l nil))
    (push (list 0 lst) s)
    (dolist (i lst t)
     (when (listp i) (push (list 1 i) s)))
    (loop
       (when (null s) (return res))
       (setq l (pop s))
       (when (and (<= (car l) n2) (>= (car l) n1) (not (member (cadr l) res)))
             (push (cadr l) res)) 
       (when (< (car l) n2)
          (dolist (i (cadr l) t)
             (when (and (listp i) (not (member (list (1+ (car l)) i) s))) 
                   (push (list (1+ (car l)) i) s)))))
    res))  
 
==> lst-lv
 
(lst-lv '(a (b (c 1) d e) f ((2 (g (h))) 3)) 1 2)
 
==> ((c 1) (b (c 1) d e) (2 (g (h))) ((2 (g (h))) 3))
 
(lst-lv '(a (b (c 1) d e) f ((2 (g (h))) 3)) 2 3)
 
==> ((c 1) (g (h)) (2 (g (h))))
Пойдет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2013, 12:30
Помогаю со студенческими работами здесь

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

Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его выделения
Задание. Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его ...

Написать программу, которая получает список из списков из списков чисел
Всем привет, мне нужно написать программу, которая получает список из списков из списков чисел, ,],,],,]] примерно так , и потом...

Написать программу: вычисление функции в заданном интервале
Определить значение функции y = arcctg ( x ) / ( x ^ 2-5x + 6) на промежутке с шагом h = 0.4 Используя для вычисления значения функции...

Выбрать в другой список те строки, которые встречаются в исходном списке более одного раза и напечатать созданный список
это два списка..а дальше как?алгоритм какой?помогите пожалуйста using System; using System.Collections.Generic; using...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru