Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивная обработка списков 
V
    Опции темы
Sensitive
Дата 25.12.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



Здравствуйте!
Задание следующее у меня:

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

Видела на Вашем же форуме предложенный вариант решения:

Код

(defun LISTLEVEL (L &optional (level 1))
 (if (null L) (cons level L)
  ((lambda (elem result)
    (cons
     (if (atom elem) elem
      (LISTLEVEL elem (1+ level)))
     result))
   (car L)
   (LISTLEVEL (cdr L) level))))



Но проблема вся в том, что у меня по заданию нельзя использовать "дополнительный параметр" "&optional (level 1)".
Вот то, что я пробую (пока поставить нумерацию хотя бы в начале каждого подсписка, в конец потом перенести не проблема):

Код

(setq x ' (a b ( c d e (f) g ( h I ) j ) k ( l ) m n ))
(setq n ' 1)

(defun vl (y n) (cond  ((null y) nil)
            ((atom(car y))(cons n y))            
            (t (vl(cdr y) (+1 n) )]

Подскажите, как нужно сделать, чтоб во всех уровнях проставилась нумерация, у меня в первом только и всё....
PM MAIL   Вверх
VH_
Дата 25.12.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 31.10.2006

Репутация: 10
Всего: 11



Добрый вечер.
Если нельзя «дополнительный <на самом деле необязательный> параметр», сделайте его обязательным - должна же функция откуда-нибудь все-таки узнать номер верхнего уровня:
Код
(defun LISTLEVEL (L level)
 (if (null L) (cons level L)
  ((lambda (elem result)
    (cons
     (if (atom elem) elem
      (LISTLEVEL elem (1+ level)))
     result))
   (car L)
   (LISTLEVEL (cdr L) level))))

(listlevel '(a b (c d e (f) g (h I) j) k (l) m n) 1)
либо сделайте функцию-обертку :
Код
(defun F (L)
 (LISTLEVEL L 1))

(F '(a b (c d e (f) g (h I) j) k (l) m n))

Это сообщение отредактировал(а) VH_ - 25.12.2009, 22:20
PM MAIL   Вверх
Sensitive
Дата 29.12.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2007

Репутация: нет
Всего: нет



Спасибо большое. Функция-обертка это то, что нужно. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.