Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсивно заменить элемент в списке, помогите с кодом, не работет. 
:(
    Опции темы
sw04
Дата 8.11.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

(setq a '(a b x d x))

(defun replace(x n v)
    (cond ((NULL v ) 0)
    (t
        (print (car v))
        (cond ((eq (car v) x) (setq v (cons n (cdr v)))))
        (replace x n (cdr v))
        (print v)
    )
    )
)
(replace 'x 'n a)

в упор не хочет заменить x на n :( 
башка уже трещит


--------------------
<удалено администрацией>
PM   Вверх
skyboy
Дата 9.11.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



как там функция проверки, является ли аргумент списком? listp? 
тогда вроде такого:
Код

(defun 
 replace
 (needle replacement source)
 (if
  (NULL source)
  (return nil)
  (if
   (listp source)
   (if 
    (eq needle (car source))
    (cons replacement (replace needle replacement (cdr source))) 
    (if
     (listp (car source))
     (return (cons (replace needle replacement (car source)) (replace needle replacement (cdr source))))
     (return (cons (car source) (replace needle replacement (cdr source))))
    )
   )
   (if
    (eq needle source) 
    (return replacement)
    (return source)
   )
  )
 ) 
)

правда, может, тебе как раз с побочными эффектами функция нужна, а не "чистая"...

Добавлено через 1 минуту и 32 секунды
естественно, куча проверок напрямую к функциональности кода не относится...
PM MAIL   Вверх
VH_
Дата 10.11.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

(defun REPLACE (_old _new _list)
 (cond
  ((null _list) nil)
  ((equal (car _list) _old) (cons _new (REPLACE _old _new (cdr _list))))
  (T (cons (car _list) (REPLACE _old _new (cdr _list))))))

Код
(defun REPLACE (_old _new _list)
 (if _list
  (cons
   (if (equal (car _list) _old)
    _new
    (car _list))
   (REPLACE _old _new (cdr _list)))))

PM MAIL   Вверх
Eduard1
Дата 28.1.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как можно рекурсивно заменить N-ый элемент в списке (указав  номер заменяемого элемента)? 

Имеется список lst 
(setq lst '(S L O V O)) 

переменные: 
X - новый символ  
N - номер элемента  

(defun Replace (X N lst) 
     (cond 
         ( (null lst) nil) 
         ..... 
         ..... 
         .....
     ) 


В итоге должно получиться: 
> (Replace 'A 5 lst) 
(S L O V A)
PM MAIL   Вверх
VH_
Дата 28.1.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

(defun F (X N L)
 (cond
  ((null L) nil)
  ((= N 0) (cons X (cdr L))) ; отцы LISPа нам завещали, что номера элементов списка начинаются с 0 (нуля)
  ((> N 0) (cons (car L) (F X (1- N) (cdr L))))
  (T L)))


PM MAIL   Вверх
k0rvin
Дата 24.1.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sw04 @ 8.11.2007,  23:41)
Код

(setq a '(a b x d x))

(defun replace(x n v)
    (cond ((NULL v ) 0)
    (t
        (print (car v))
        (cond ((eq (car v) x) (setq v (cons n (cdr v)))))
        (replace x n (cdr v))
        (print v)
    )
    )
)
(replace 'x 'n a)

в упор не хочет заменить x на n :( 
башка уже трещит

Код

(defun replace (a b xs &key (test #'eq))
  (loop for x in xs collect (if (funcall test x a) b x)))



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
VH_
Дата 24.1.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>k0rvin
Задание: «...рекурсивно заменить элемент в списке...»
PM MAIL   Вверх
k0rvin
Дата 24.1.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VH_ @ 24.1.2010,  16:37)
>k0rvin
Задание: «...рекурсивно заменить элемент в списке...»

а, т.е. полностью свой велосипед, даже без map'а? =)

ну тогда
Код

(defun replace2 (a b xs &key (test #'eq))
  (labels ((rec (xs)
             (if (null xs)
                 nil
                 (destructuring-bind (x &rest xs) xs
                   (cons (if (funcall test x a) b x)
                         (rec xs))))))
    (rec xs)))


Это сообщение отредактировал(а) k0rvin - 24.1.2010, 20:32


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
VH_
Дата 24.1.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хювёнен-Сеппянен "Мир Лиспа" т.1 стр.205:
«Функция является рекурсивной, если в её определении содержится вызов самой этой функции.»
PM MAIL   Вверх
k0rvin
Дата 24.1.2010, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VH_ @ 24.1.2010,  21:20)
Хювёнен-Сеппянен "Мир Лиспа" т.1 стр.205:
«Функция является рекурсивной, если в её определении содержится вызов самой этой функции.»

ну так rec у меня вполне рекурсивна =)

да и книжка мне эта не очень понравилась, "On Lisp" и "PCL" интересней =)

Это сообщение отредактировал(а) k0rvin - 24.1.2010, 22:18


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
luser78
Дата 24.1.2010, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот правильный код :

Код

(defun REM (x y l)

(COND

((NULL l) nil) 

(   ( EQUAL x (CAR l)) (REM x y (CONS y (CDR l)))  ) 

(   t (CONS (CAR l) (REM x y (CDR l)))   )


)

(setq l '(11 2 2 ))
(setq x 1)
(setq y 7)
(print l)
(print (REM x y l))

PM MAIL   Вверх
VH_
Дата 25.1.2010, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>k0rvin
Попробуйте вызвать Вашу функцию (rec) за пределами Вашей функции (replace2). Результат соблаговолите сообщить.
>luser78
Ваша функция (rem) работоспособна, но для каждого элемента исходного списка, равного «новому» значению, выполняет лишний вызов самой себя. И чем больше подходящих для замены элементов, тем больше лишних вызовов. Разработчикам таких функций привет.
PM MAIL   Вверх
k0rvin
Дата 25.1.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VH_ @ 25.1.2010,  00:00)
>k0rvin
Попробуйте вызвать Вашу функцию (rec) за пределами Вашей функции (replace2). Результат соблаговолите сообщить.

я и без запуска могу сказать, что будет =)

только не вижу проблем. функция rec описана рекурсивно? рекурсивно. процесс она порождает рекурсивный? рекурсивный.

зачем же лишние разы передавать переменные, не изменяющиеся от вызова к вызову? лишний расход памяти, лишнее загромождение кода... =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
VH_
Дата 25.1.2010, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да, в принципе я ничего не имею против утверждения, что у Вас проблем никаких не было бы - не Вам же показывать текст преподу и выслушивать его комментарии и оценки.
PM MAIL   Вверх
adejneka
Дата 25.1.2010, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

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



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

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

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


 




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


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

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