Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Необходимо узнать все вхождения списка Х в список Н
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
xmtgx xmtgx вне форума
Member
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.05.2009
По умолчанию Необходимо узнать все вхождения списка Х в список Н - 14.05.2009, 09:12

Вот задачка занятная:
Даны два списка Х и Н. Необходимо узнать все вхождения списка Х в список Н и вернуть порядковые номера этих вхождений. Порядковый номер определяется по первому элементу. Например:
(funkcia '(1 2) '(3 1 2 1 2 3 2)) и выводиться должно 2 и 4
(funkcia '(1 1) '(2 1 1 1 1 3 4)) -> 2, 3 ,4
Ответить с цитированием
  (#2 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.05.2009, 09:52

Код:
(defun F (X H &optional (i 0))
  (if H
   ((lambda (test result)
     (if test result
      (cons i result)))
    (member nil (mapcar 'equal X H))
    (F X (cdr H) (1+ i)))))
Элементы списка в LISPе нумеруются с нуля.
Ответить с цитированием
  (#3 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.05.2009, 11:15

Исправление:
Код:
(defun F (X H &optional (i 0) (lx (length X)) (lh (length H)))
  (if (<= lx lh)
   ((lambda (test result)
     (if test result
      (cons i result)))
    (member nil (mapcar 'equal X H))
    (F X (cdr H) (1+ i) lx (1- lh)))))
Ответить с цитированием
  (#4 (permalink)) Старый
xmtgx xmtgx вне форума
Member
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.05.2009
По умолчанию 15.05.2009, 08:34

О! Очень благодарна!!
На Corman всё работает. А почемуто на MU не очень.
Ответить с цитированием
  (#5 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 15.05.2009, 21:45

http://www.progz.ru/forum/index.php?s=&amp...st&p=181412
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
xmtgx xmtgx вне форума
Member
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.05.2009
По умолчанию 16.05.2009, 00:49

В MuLisp
и так всё бесконечно циклично.
Ответить с цитированием
  (#7 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 16.05.2009, 01:33

Из разглядывания протокола:
1) в «ортодоксальном» LISPе есть встроенные функции (1+) и (1-). Если Вы вместо имен функций применили конструкции типа (1<пробел>+<пробел>i) и (1<пробел>-<пробел>lx) - внесите исправления. Если в этом диалекте встроенных функций (1+) и (1-) нет - примените функции (+) и (-).
2) Вероятно, в этом диалекте возможности необязательных формальных параметров (&optional) нет. В таком случае можно в определении функции (F) объявить все формальные параметры обязательными
Код:
(defun F (X H i lx lh)
  (if (<= lx lh)
   ((lambda (test result)
     (if test result
      (cons i result)))
    (member nil (mapcar 'equal X H))
    (F X (cdr H) (+ i 1) lx (- lh 1)))))
и применить функцию-обертку (F_shell), которая будет вызывать функию (F) с необходимыми значениями фактических параметров:
Код:
(defun F_shell (X H)
  (F X H 0 (length X) (length H)))
Ответить с цитированием
  (#8 (permalink)) Старый
xmtgx xmtgx вне форума
Member
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.05.2009
По умолчанию 17.05.2009, 09:13

Большое спасибо!!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для списка L и элемента a вычислить максимальную глубину вхождения Nastya* Lisp 4 18.12.2011 22:48
Удалить все вхождения элемента Х в список L Chummy89 Lisp 3 08.12.2011 14:58
Необходимо добавить один элемент в начало списка katik Lisp 1 15.05.2011 14:04
программа которая берет список и создает список другой из этого же списка + исходный Ma3day Prolog 5 26.11.2010 15:40
Удалить все вхождения подсписка в список Hohhi Prolog 15 19.10.2010 01:17
Удаление элемента из списка, кроме первого вхождения Devil1991 Prolog 4 13.10.2010 21:36
Номер последнего вхождения элемента a в список L Bigspacehamster Lisp 4 31.05.2010 19:17
Как построить список из элементов 1го списка входящих во 2ой список Ирина 24 Lisp 3 10.02.2009 10:55
Построить список из элементов 2го списка не входящий в 1ый список Ирина 24 Lisp 4 10.02.2009 10:28
Нужно написать функцию, удаляющую повторные вхождения элементов в список wert30 Lisp 2 23.01.2009 15:03
Удалить повторные вхождения элементов списка Сherski Prolog 2 22.01.2009 21:47
Поиск вхождения одного списка в другой Blo Prolog 47 14.05.2006 18:34



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов