Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2011, 12:14   #1
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию Лисп. Выход из рекурсии

необходимо добавить к списку два элемента рекурсивным способом
(a b c d) преобразовать к (a b c d obj1 obj2)
добавить объекты не составляет сложности
подскажите, пожалуйста, как составить условие выхода из рекурсии
s2dentishe вне форума Ответить с цитированием
Старый 24.02.2011, 12:58   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Тут по-разному придумать можно. Первое, что пришло мне в голову: проверять, является ли второй аргумент(первый объект) нулевой ссылкой, если да, то завершаем рекурсию, если нет, то цепляем его к списку и вызываем ф-цию с вторым объектом, как вторым параметром, а третьим передаём nil. То есть как-то так:
Код:
(defun add-two-objects (a-list first-object second-object)
  (cond ((null first-object) a-list)
        (T (rplacd (last a-list) (cons first-object nil))
           (add-two-objects a-list second-object nil))))
Код:
* (add-two-objects '(1 2 3 4) 5 6)
(1 2 3 4 5 6)

Последний раз редактировалось netrino; 24.02.2011 в 13:02. Причина: let лишний убрал
netrino вне форума Ответить с цитированием
Старый 24.02.2011, 14:17   #3
s2dentishe
Пользователь
 
Регистрация: 13.11.2009
Сообщений: 70
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Тут по-разному придумать можно. Первое, что пришло мне в голову: проверять, является ли второй аргумент(первый объект) нулевой ссылкой, если да, то завершаем рекурсию, если нет, то цепляем его к списку и вызываем ф-цию с вторым объектом, как вторым параметром, а третьим передаём nil. То есть как-то так:
Код:
(defun add-two-objects (a-list first-object second-object)
  (cond ((null first-object) a-list)
        (T (rplacd (last a-list) (cons first-object nil))
           (add-two-objects a-list second-object nil))))
Код:
* (add-two-objects '(1 2 3 4) 5 6)
(1 2 3 4 5 6)
Идея хорошая, но функции rplacd и last не работают вместе: компилятор выводит ошибку о работе функции rplacd

Последний раз редактировалось s2dentishe; 24.02.2011 в 14:22.
s2dentishe вне форума Ответить с цитированием
Старый 24.02.2011, 14:37   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Странно, у меня всё работает, проверил на нескольких реализациях(http://ideone.com/ACcxc). Вы нигде не допустили ошибку? А если предварительно сохранить значение (last в переменную, а затем уже к ней применить (rplacd?
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. Лисп s2dentishe Помощь студентам 4 22.02.2011 19:50
Лисп (рекурсии и списки) Dmitro62 Помощь студентам 0 19.01.2011 20:11
Задача на ЛИСП Alexey123 Помощь студентам 2 24.12.2010 16:27
Лисп сопоставить leest Помощь студентам 9 09.03.2010 23:13
выход из рекурсии L_M Помощь студентам 9 03.10.2008 18:03