Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу список луковица
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
donandrey donandrey вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2015
По умолчанию список луковица - 17.09.2015, 22:34

видел на форуме решение этой задачи на Prologe, помогите решить на Lisp

Разработать функцию, преобразующую исходный список, в список «луковицу».
Например:
Вход: (3 2 1 2 3).
Выход: (3 (2 (1) 2) 3).
Ответить с цитированием
  (#2 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 525
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 24.09.2015, 16:21

lisp Код:
(defun onion (w)
  (if (null (cdr w))
      w
      (list (car w)
            (onion (butlast (cdr w)))
            (car (last w)))))

> (onion '(1 2 3 2 1))
(1 (2 (3) 2) 1)
> (onion '(3 2 1 2 3))
(3 (2 (1) 2) 3)
Ответить с цитированием
  (#3 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 525
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 24.09.2015, 16:22

lisp Код:
(defun onion (w)
  (if (cdr w)
      (list (car w)
            (onion (butlast (cdr w)))
            (car (last w)))
      w))

> (onion '(3 2 1 2 3))
(3 (2 (1) 2) 3)
> (onion '(1 2 3 2 1))
(1 (2 (3) 2) 1)
Ответить с цитированием
Пользователь сказал cпасибо:
donandrey (25.09.2015)
  (#4 (permalink)) Старый
donandrey donandrey вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2015
По умолчанию 25.09.2015, 18:32

спасибо большое, можешь пожалуйста на словах объяснить как тут работает рекурсия
Ответить с цитированием
  (#5 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 525
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 26.09.2015, 14:47

Если в списке w два или больше элементов (cdr w), то функция onion возвращает список из первого элемента, вызова той же onion (это и есть рекурсия, когда функция вызывает саму себя) куда передается обрезанный с обеих сторон список (butlast (cdr w))и последнего элемента (car (last w)). Если в списке остался лишь один элемент, то он возвращается в последней строке - w.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задан список произвольного уровня вложенности,превратить его в список атомов Дрон Lisp 6 19.11.2014 22:38
список Vanya. Prolog 11 25.11.2013 22:19
программа которая берет список и создает список другой из этого же списка + исходный Ma3day Prolog 5 26.11.2010 15:40
Список katys Prolog 4 19.05.2010 02:00
Список xVoice Prolog 2 21.12.2009 12:08
список Novichok92 Prolog 1 26.11.2009 10:17
Задан список произвольного уровня вложенности, сформировать из него новый список Kolobov_Anton Lisp 3 26.03.2009 22:29
Как построить список из элементов 1го списка входящих во 2ой список Ирина 24 Lisp 3 10.02.2009 10:55
Построить список из элементов 2го списка не входящий в 1ый список Ирина 24 Lisp 4 10.02.2009 10:28
Список loxmatii Prolog 0 18.04.2008 12:00
Список-"луковица" на выходе Prologger Prolog 3 04.02.2007 23:00
Список Иринаnew Prolog 32 08.04.2006 23:21



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов