![]() |
|
![]() ![]() ![]() |
|
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Здравствуйте!
У меня такая задача в XLISP: Определить функцию, зависящую от одного аргумента, которая по данному списку вычисляет список его элементов, встречающихся в нём более одного раза. Подскажите, что неверно, не работает.
|
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
|
|||
|
||||
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Привет!!! Так просто?
Сразу видно, что Шустрый мыслит в стиле функционального программирования. Но всё же не совсем верно, так как получается: из списка (3 3 3 3 5 4 6 9 9 9) делает список (3 2 9 9), то есть повторяет элементы, которые были написаны более 2 раз - девятки. Добавлено через 5 минут и 23 секунды Я неверно первый список дала: (3 3 5 4 6 9 9 9 9) то есть две тройки были... |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
Шустрый не мой ник. |
|||
|
||||
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Привет, VH!
Извиняюсь за неправильный ник. Огромное спасибо за помощь, всё работает. Может быть подмогнёшь решить ещё одну задачку: Определить функцию, зависящую от двух аргументов u и n, которая по данному списку строит список его элементов, встречающихся в нём не менее n раз. Проверить работу этой функции на примере ( a a b a c b c a b b d a d ) для n=1, 2, 5, 0. По-честному, решение у меня имеется но оно такое-же как и к первой задаче. Но это не то,что надо. Я надеюсь на помощь. Для VH и всех кто зайдёт сегодня - 1 апреля сюда: Поздравляю с праздником, Праздником - проказником! Никому не надоели Шутки первого апреля, А скорей - наоборот: Посмеяться рад народ! |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
|
|||
|
||||
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Привет, VH!
Делаю вызов функции следующим образом: (F '(2 5 5 5 5 5 3 6) 2) -> В одних случаях - ЛИСП не выдаёт никакого результата, в других случаях выдаёт ошибку функции SUBSTITUTE. Я неверно вызываю функцию или ошибка в программном коде? Пытаюсь разобраться не очень-то получается... Функция SUBSTITUTE заменяет вхождения данного элемента на новый, используя предикат сравнения :test 'EQUAL. Поясните, пожалуйста, какие элементы сравниваются в данном случае и почему элементы надо заменять, а не удалять. Не могу разобраться, подскажите... Очень жду. |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
XLISP-PLUS version 3.04
Portions Copyright © 1988, by David Betz. Modified by Thomas Almy and others. > (defun F (L N &optional acc) (if L (F (cdr L) N ((lambda (elem link) (if link (substitute (cons elem (1+ (cdr link))) link acc :test 'EQUAL) (cons (cons elem 1) acc))) (car L) (assoc (car L) acc))) (apply 'append (mapcar '(lambda (elem) (if (>= (cdr elem) N) (cons (car elem) nil))) acc)))) F > (F '(2 5 5 5 5 5 3 6) 2) (5) > (trace F) (F) > (F '(2 5 5 5 5 5 3 6) 2) Entering: F, Argument list: ((2 5 5 5 5 5 3 6) 2) Entering: F, Argument list: ((5 5 5 5 5 3 6) 2 ((2 . 1))) Entering: F, Argument list: ((5 5 5 5 3 6) 2 ((5 . 1) (2 . 1))) Entering: F, Argument list: ((5 5 5 3 6) 2 ((5 . 2) (2 . 1))) Entering: F, Argument list: ((5 5 3 6) 2 ((5 . 3) (2 . 1))) Entering: F, Argument list: ((5 3 6) 2 ((5 . 4) (2 . 1))) Entering: F, Argument list: ((3 6) 2 ((5 . 5) (2 . 1))) Entering: F, Argument list: ((6) 2 ((3 . 1) (5 . 5) (2 . 1))) Entering: F, Argument list: (NIL 2 ((6 . 1) (3 . 1) (5 . 5) (2 . 1))) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) Exiting: F, Value: (5) (5) > |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
Идея такая:
Пока список L не кончился, функция (F) вызывается для «хвоста» списка, при этом в аккумуляторе acc накапливаются счетчики экземпляров элементов списка в виде точечных пар (элемент_списка . количество), то есть если на очередном этапе счетчика первого элемента списка в аккумуляторе нет, то в аккумулятор добавляется счетчик (элемент . 1), а если такой элемент ранее уже встречался в списке и его счетчик уже есть в аккумуляторе, то поле количество увеличивается на единицу и "новый" счетчик заменяет "старый" в аккумуляторе. Когда список L заканчивается, из аккумулятора извлекаются (в списке) те элементы, количества которых в списке не меньше числа N. |
|||
|
||||
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Привет, VH!
Спасибо, спасибо за исчерпывающий ответ! Но у меня всё же программулина не работает, дело в том, что у меня версия Лиспа 2.1, он наверное просто не понимает функцию SUBSTITUTE. |
|||
|
||||
VH_ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 182 Регистрация: 31.10.2006 Репутация: 10 Всего: 11 |
LISP тем и хорош, что при отсутствии необходимого средства его можно определить самостоятельно и на ходу. |
|||
|
||||
malaja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.11.2006 Репутация: нет Всего: нет |
Спасибо за помощь!!!
|
|||
|
||||
_sg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 16.5.2007 Репутация: 2 Всего: 2 |
как вариант:
--------------------
vk.com/ansicommonlisp |
|||
|
||||
![]() ![]() ![]() |
Правила форума LISP | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | LISP | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |