Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > LISP > рекурсивно заменить элемент в списке |
Автор: sw04 8.11.2007, 23:41 | ||
в упор не хочет заменить x на n :( башка уже трещит |
Автор: skyboy 9.11.2007, 00:41 | ||
как там функция проверки, является ли аргумент списком? listp? тогда вроде такого:
правда, может, тебе как раз с побочными эффектами функция нужна, а не "чистая"... Добавлено через 1 минуту и 32 секунды естественно, куча проверок напрямую к функциональности кода не относится... |
Автор: VH_ 10.11.2007, 22:56 | ||||
|
Автор: Eduard1 28.1.2009, 16:09 |
А как можно рекурсивно заменить 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) |
Автор: VH_ 28.1.2009, 16:35 | ||
|
Автор: k0rvin 24.1.2010, 09:58 | ||||||
|
Автор: VH_ 24.1.2010, 16:37 |
>k0rvin Задание: «...рекурсивно заменить элемент в списке...» |
Автор: k0rvin 24.1.2010, 20:26 | ||||
а, т.е. полностью свой велосипед, даже без map'а? =) ну тогда
|
Автор: VH_ 24.1.2010, 21:20 |
Хювёнен-Сеппянен "Мир Лиспа" т.1 стр.205: «Функция является рекурсивной, если в её определении содержится вызов самой этой функции.» |
Автор: k0rvin 24.1.2010, 22:17 | ||
ну так rec у меня вполне рекурсивна =) да и книжка мне эта не очень понравилась, "On Lisp" и "PCL" интересней =) |
Автор: luser78 24.1.2010, 22:42 | ||
Вот правильный код :
|
Автор: VH_ 25.1.2010, 00:00 |
>k0rvin Попробуйте вызвать Вашу функцию (rec) за пределами Вашей функции (replace2). Результат соблаговолите сообщить. >luser78 Ваша функция (rem) работоспособна, но для каждого элемента исходного списка, равного «новому» значению, выполняет лишний вызов самой себя. И чем больше подходящих для замены элементов, тем больше лишних вызовов. Разработчикам таких функций привет. |
Автор: k0rvin 25.1.2010, 00:20 | ||
я и без запуска могу сказать, что будет =) только не вижу проблем. функция rec описана рекурсивно? рекурсивно. процесс она порождает рекурсивный? рекурсивный. зачем же лишние разы передавать переменные, не изменяющиеся от вызова к вызову? лишний расход памяти, лишнее загромождение кода... =) |
Автор: VH_ 25.1.2010, 01:11 |
Да, в принципе я ничего не имею против утверждения, что у Вас проблем никаких не было бы - не Вам же показывать текст преподу и выслушивать его комментарии и оценки. |
Автор: adejneka 25.1.2010, 06:33 |
2k0rvin: в Common Lisp по умолчанию для проверки равенства принято использовать EQL, а не EQ (последняя часто не работает с числами). |
Автор: luser78 25.1.2010, 11:55 |
sw04, бери мой код,, обмозговывай - он работает 100%, там применяется рекурсия. Если хочешь ещё проверку на новые элементы сделать (чтобы рекрси меньшее кол-во раз выполнялась), то делай!! А так работает все))) Серьезно! |
Автор: VH_ 25.1.2010, 12:57 |
Уважаемый luser78, сообщение sw04 датируется 8.11.2007. |
Автор: k0rvin 25.1.2010, 19:13 | ||
буду знать. в литературе чаще видел eq, но там правда в основном предполагались символы по-умолчанию =) |
Автор: _sg 25.4.2014, 11:32 | ||
как вариант:
|