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

Рекурсивное преобразование списка

06.01.2012, 03:26. Показов 4378. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Помогите пожалуйста с задачей:

Используя приемы рекурсии в Лиспе, выполнить преобразование какого-либо одноуровневого списка вида (a b c d e f g h i j k l m n) получив список вида ((a) (b c) (d e f) (g h i j)), т.е. сгруппировать элементы списка увеличивая размер каждой последующей группы на 1 элемент.

Спасибо за внимание
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2012, 03:26
Ответы с готовыми решениями:

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

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

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

25
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 04:52
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun f (lst &optional (group-list '()) (counter 0) (group 1))
  (if (eql counter group)
      (cons group-list (f lst '() 0 (1+ group)))
      (if lst (f (cdr lst) `(,@group-list ,(car lst)) (1+ counter) group))))
 
CL-USER> (f '(1 2 3))
((1) (2 3))
CL-USER> (f '(1 2 3 4))
((1) (2 3))
CL-USER> (f '(a b c d e f g h i j k l m n))
((A) (B C) (D E F) (G H I J))
3
1 / 1 / 0
Регистрация: 17.11.2011
Сообщений: 21
06.01.2012, 14:09  [ТС]
Огромное Вам спасибо! У меня действительно не было ни малейшего представления что так можно сделать.
Однако возникла другая проблема - оказывается, преподаватель требует чтобы задача была написана под PC-LISP 3.00. Я прошу прощения что не указал этого сразу, действительно был не в курсе((
Знающие люди, кто сможет переписать решение под PC-LISP 3.00?
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 14:18
Lisp
1
2
3
4
(defun f (lst &optional (group-list '()) (counter 0) (group 1))
  (cond ((= counter group) (cons group-list (f lst '() 0 (1+ group))))
    (t (cond ((null lst) nil)
         (t (f (cdr lst) `(,@group-list ,(car lst)) (1+ counter) group))))))
Что-то многие подсели на эту реализацию CL.
1
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 14:38
bokunopico, я что-то не понял, в чём различие? cond в if разворачивается, или я не прав?
0
1 / 1 / 0
Регистрация: 17.11.2011
Сообщений: 21
06.01.2012, 14:49  [ТС]
bokunopico, И еще раз спасибо Вам огромное, все работает как надо!
У меня возник вопрос - нельзя ли в этой задаче обойтись без опционального аргумента? Я понимаю что без него увеличится код, но судя по тому что я с ним сталкиваюсь 1й раз в жизни, преподаватель несколько удивится что использован материал который он не давал
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 15:01
ну и?

Добавлено через 12 минут
я пойму, если этот код работать не будет
Lisp
1
2
3
4
5
6
7
(defun f (l)
           (labels ((fun (l n)
                      (if l (cons
                             (loop for a from 1 to n
                                  for b in l collect b)
                             (fun (nthcdr n l) (1+ n))))))
             (fun l 1)))
я так понял, ты хорошо знаком с PC-LISP 3.00, на мой вопрос ответь)
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 19:57
transformator.t, в PC-LISP нет такой конструкции:
Lisp
1
(if test-form then-form [ else-form ])
Вместо неё пользуемся аналогичной:
Lisp
1
(cond (test-form else-form)[(t else-form)])
Хотя в файле IF.L есть готовенький макрос IF, позволяющий устранить этот недостаток:
Lisp
1
2
3
4
5
6
7
8
;--- super if macro
; This macro allow the following forms:
;       (If a then b)   ==>  (cond (a b))
;       (If a thenret)  ==>  (cond (a))
;       (If a then b else c) ==> (cond (a b) (t c))
;       (If a then b b2              ==> (cond (a b b2) (c d d2) (t e))
;        elseif c then d d2
;        else e)
Добавлено через 12 минут
O labels, судя по ошибке, создатели тоже подумали, как о чём-то лишнем.

Добавлено через 1 минуту
stvk, а что можно использовать?
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 20:03
Цитата Сообщение от bokunopico Посмотреть сообщение
O labels, судя по ошибке, создатели тоже подумали, как о чём-то лишнем.
смешно))
и чем if-форма не угодила создателям?)
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 20:12
Могу ещё добавить, что с loop он тоже не дружит, зато такой макрос, как do, там поддерживается.
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 20:19
правильно - синтаксический сахар не нужен
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 20:28
Так вроде у loop гораздо шире возможности, нежели у do, значит, do надо было выкидывать из реализации. Вот с if правильно поступили: выражается через cond, множественное ветвление на нём неудобно читается, не нужен.
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 20:38
а у iterate говорят есчё шире, но я его не юзаю, loop пока хватает.
мне if нравиться))
1
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 20:41
Спасибки, почитаю про iterate, правда я и loop-ом не умею пользоваться, но поскольку iterate круче, то loop для слабых.
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 20:48
iterate придётся загружать)) типа quickload или asdf, ну а loop сразу в cl
Цитата Сообщение от bokunopico Посмотреть сообщение
то loop для слабых
как сказал Peter Seibel - "LOOP для мастеров с чёрным поясом"
ну а чё loop? - хорошо
Lisp
1
2
3
4
5
(do ((nums nil) (i 1 (1+ i)))
((> i 10) (nreverse nums))
(push i nums)) ==> (1 2 3 4 5 6 7 8 9 10)
 
(loop for i from 1 to 10 collecting i) ==> (1 2 3 4 5 6 7 8 9 10)
0
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 21:06
Кстати, а насколько плохо определять локальную рекурсивную функцию без labels? То есть напрямую через defun. Просто в SICP там это довольно широко применялось, но мы же не на Schemе пишем для ТС. Тогда ему можно предложить такой вариант без необязательных параметров:
Lisp
1
2
3
4
5
6
(defun f (L)
  (defun iter (lst group-list counter group)
    (cond ((= counter group) (cons group-list (iter lst '() 0 (1+ group))))
      (t (cond ((null lst) nil)
           (t (iter (cdr lst) `(,@group-list ,(car lst)) (1+ counter) group))))))
  (iter L '() 0 1))
1
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 21:15
так labels - локальна, а defun - глобальна
ты сможешь iter вызывать, а оно тебе надо?
1
313 / 268 / 5
Регистрация: 03.04.2011
Сообщений: 456
06.01.2012, 21:27
Моя невнимательность, объяснюсь:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#lang racket
(define (f L)
  (define (iter lst group-list counter group)
    (cond ((= counter group) (cons group-list (iter lst '() 0 (+ group 1))))
      (#t (cond ((null? lst) null)
                    (#t (iter (cdr lst) `(,@group-list ,(car lst)) (+ counter 1) group))))))
  (iter L '() 0 1))
 
> (f '(1 2 3))
'((1) (2 3))
> (f '(a b c d e f g h i j k l m n))
'((a) (b c) (d e f) (g h i j))
> (iter '(1 2 3) '() 0 1)
. . reference to an identifier before its definition: iter
Бяки вы со своим этим CL.
0
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
06.01.2012, 21:33
ачоу
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
07.01.2012, 04:39
bokunopico, defun, ЕМНИП, создает глобальную привязку, а define — локальную
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2012, 04:39
Помогаю со студенческими работами здесь

ПРеобразование списка
Здравствуйте. Есть задача, помогите пожалуйста ее решить. Заранее спасибо. Определить функцию, преобразующую список (a (b (с))) к...

Преобразование списка
Под именем x задано список (a(b(c(d)))). Надо получить новый список((((a)b)c)d), не используя при этом дополнительные ячейки памяти.

Преобразование списка в множество
Здравствуйте! Пытаюсь преобразовать список элементов в множество, причем список может содержать другие списки: (A B (A C (X B Y) A) D)...

Преобразование списка в множество, работа с деревьями
1.Опре-ть функцию МНОЖ-ВО, преобразующую список в множество. 2.Опред-ть функцию (ДОБАВЬ а дерево), которая добавляет в упорядоч. дерево...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru