|
1 / 1 / 0
Регистрация: 13.05.2012
Сообщений: 16
|
||||||
Список: Написать программу для выделения списков в заданном интервале в произвольно введенном исходном списке.17.03.2013, 23:55. Показов 3459. Ответов 27
Метки нет (Все метки)
Написать программу для выделения списков в заданном интервале в произвольно введенном исходном списке.
Сформировать их них список и вывести его. Исходный список имеет уровень 0, вложенный список имеет уровень 1 и т.д. Пример. (a(b(с 1)d e)f((2(g))3)) с 2-3 уровни ((с 1)(2(g))(g)) Пыталась сначала выделить списки на определенном уровне, но и это не работает правильно. Помогите, пожалуйста!!!
0
|
||||||
| 17.03.2013, 23:55 | |
|
Ответы с готовыми решениями:
27
Написать программу выделения списков на заданном уровне Написать программу выделения атомов в заданном интервале уровней Написать функцию , которая строит список элементов, стоящих в исходном списке на четных местах |
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
| 18.03.2013, 12:34 | |
|
Catstail, своё-то легко написать, а чужой код поправить слабо?
Давайте будем нести Лисп в массы, а не склонять народ к халтурной копипасте. Тем более, Nsity явно делом занимается, а не ждёт халявы.
0
|
|
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|||||||||||||||||||||||||||
| 18.03.2013, 13:54 | |||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Да я сам смотрю, почти заработало. Сейчас напишу.
Добавлено через 1 час 9 минут ![]() Nsity, насколько я понял, вашей идеей было использовать функцию p2, которая сама по себе ничего не считала бы, а существовала исключительно ради сайд-эффекта: собирала бы значения в переменную. Относитесь настороженно к сайд-эффектам. Не работала она в первую очередь потому, что при каждом рекурсивном вызове создавалась новая переменная rezx. Вот как можно этого избежать с помощью глобальной переменной:
Зато ответ правильный.Прежде всего, несколько замечаний по коду. Во-первых, как видите, всё сделал маленькими буквами. Во-вторых, у вас была путаница с уровнями вложенности (надо было на единицу уменьшать). В третьих, это
(cons L1X1 ()) - это (list l1x1). И вообще, зачем в хвост? Добавляйте лучше в голову, это всегда дешевле и короче: (push l1x1 rezx).В-четвёртых, я дописал вам и проверку того, надо ли включать текущий список. И получилась рабочая функция. Замечание насчёт if. Тот факт, что эта форма не предусматривает implicit progn (то есть progn приходится самому писать), намекает, что if в первую очередь предназначен для вычисления значения, а не для условного выполнения. Когда вы пишете функционально, у вас никаких блоков последовательных функций не может быть: куда девались бы ответы первых функций? Если вам нужно именно условное выполнение, лучше по возможности пользоваться специально созданными when/unless с implicit progn-ом. Конечно, интерфейс через глобальную переменную - это глупость. Можно объявить функцию p2 внутри let-а, что сделает для этой функции доступной неглобальную переменную, невидимую из остальной программы. Вот так:
Такая конструкция, когда функция использует переменную, объявленную на более высоком уровне, называется замыканием. Обратите внимание: переменные, объявляемые let-ом, живут вечно, но видны только внутри своего let-а (lexical scope). Это обеспечивает нам инкапсуляцию. Однако в действительности замыкание не было бы нужно, если бы вы мыслили более функционально. Использование повтороного присванивания одной и той же переменной - императивный подход. В функциональном подходе тоже вводят переменные, но они скорее обозначения, чем переменные: им не присваивают значения повторно. Эти переменные служат для того, чтобы передать их функциям, которые вычислят значения, которые они передадут другим функциям и пр. Функциональное программирование - это непрерывный поток данных, обрабатываемых функциями. Хотя моё собственное решение, которое я хочу показать, не функциональное, там тоже есть присваивание. Потому что Лисп не Хаскел, можно как угодно писать.
Да, nconc - это то же, что и append, только опасный вариант. Если сомневаетесь, используйте append. (Здесь я могу использовать nconc, потому что вижу создание списка res с самого начала и вижу, что ничего не порушится.) Вот! Теперь задавайте вопросы.
2
|
|||||||||||||||||||||||||||
|
Супер-модератор
|
|||||||||||
| 18.03.2013, 17:56 | |||||||||||
|
Вот объяснение моего решения (нерекурсивное и без явных присвоений):
Этот код можно упростить:
1
|
|||||||||||
|
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
|
|||||||||||
| 18.03.2013, 18:27 | |||||||||||
|
вариант записи решения helter:
сам придумать ничего не могу:
2
|
|||||||||||
|
1 / 1 / 0
Регистрация: 13.05.2012
Сообщений: 16
|
||||||
| 18.03.2013, 20:41 [ТС] | ||||||
|
Спасибо за ваши решения, но я еще многих функций типа let, when и т.д. особо не знаю...
Вот на основе ваших решений сделала такую программу. Работает вроде правильно, но в ответ выводит 2 раза одно и тоже. Как от этого избавиться?
0
|
||||||
|
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
||||||
| 18.03.2013, 21:09 | ||||||
|
Nsity, скобки -
![]() Так вы зачем-то печатаете: princ. Вместо (princ rezx) напишите просто rezx, чтобы функция возвращала значение, и всё. Лучше считать отдельно, выводить на печать отдельно. let - совершенно фундаментальная вещь, гораздо важнее, чем операторы присваивания. Странно, что вы знаете последние и не знаете первого. Макрос let создаёт локальные переменные, а точнее, биндинги (binding читается байндинг, но это трудно произнести русскими звуками). Используется так:
when и unless - макросы для выполнения одного или нескольких действий при (не)выполнении некоторого условия. См. http://www.lispworks.com/docum... _when_.htm И вообще обратите внимание на этот сайт.
1
|
||||||
|
Супер-модератор
|
||||||
| 20.03.2013, 15:35 | ||||||
|
Вот еще решение:
0
|
||||||
| 20.03.2013, 15:35 | |
|
Составить программу для выделения D - экстремального подмножества в заданном графе согласно указанному алгоритму его выделения
Выбрать в другой список те строки, которые встречаются в исходном списке более одного раза и напечатать созданный список Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс
Ссылка на сгенерированную музыкальную композицию:
https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013
Я говорю, что Время- как вода
течет. . .
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|