Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Написать функцию аргументов L1 L2, возвращающую Т
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию Написать функцию аргументов L1 L2, возвращающую Т - 29.11.2006, 15:27

Люди, помогите с задачкой!
Написать функцию аргументов L1 L2, возвращающую Т, если L2 является подсписком L1. Элементами списков могут быть атомы и списки любой вложенности
Ответить с цитированием
  (#2 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 29.11.2006, 17:43

"...Список в Лиспе - это тоже перечень или даже точнее - упорядоченная последовательность, элементами (element) которой являются атомы либо списки (подсписки)..." (Хювёнен-Сеппянен т.1 2.ОСНОВЫ ЯЗЫКА ЛИСП 2.1.Символы и списки)
Так как подсписок - это список, являющийся элементом списка, в задаче необходимо определить, нет ли среди элементов (верхнего уровня!) списка L1 в точности такого же, как список L2 (сравнение в смысле EQUAL):
Код:
(defun SUBLIST (L1 L2)
  (if L1
   (cond
    ((equal L2 (car L1)))
    (T (SUBLIST (cdr L1) L2)))))
Данная функция пригодна и в случае, если L2 - атом. Допустимо ли это для данной задачи?
Ответить с цитированием
  (#3 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию 30.11.2006, 15:30

Спасибо огромное.
Ответить с цитированием
  (#4 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию 05.12.2006, 14:21

Только вот почему-то эта функция всегда NIL выдает.
Может что-то не так? Вроди всё правильно.
Ответить с цитированием
  (#5 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 05.12.2006, 18:17

Какие примеры использовались?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию 08.12.2006, 11:06

Цитата:
Какие примеры использовались?
Использовал и с атомами и со списками, всё равно NIL выдает.
Может что не так делаю?
Ответить с цитированием
  (#7 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 08.12.2006, 12:56

Конкретно напишите выражения, пожалуйста.
Ответить с цитированием
  (#8 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию 12.12.2006, 13:33

Цитата:
Конкретно напишите выражения, пожалуйста.

Не получается со списками любой вложенности
Ответить с цитированием
  (#9 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 12.12.2006, 15:32

Уважаемый(ая), Вы могли бы представить конкретный пример, типа:
> (sublist '(1 2 3) 3)
T
> (sublist '(1 2 3) 4)
NIL
> (sublist '(1 (2 3)) '(2 3))
T
(неужели у Вас иначе?)
Ответить с цитированием
  (#10 (permalink)) Старый
volonter volonter вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2006
По умолчанию 14.12.2006, 15:35

Цитата:
Уважаемый(ая), Вы могли бы представить конкретный пример, типа:
> (sublist '(1 2 3) 3)
T
> (sublist '(1 2 3) 4)
NIL
> (sublist '(1 (2 3)) '(2 3))
T
(неужели у Вас иначе?)

У меня всё так!
Но вот большая вложенность не получается например: (sublist '(1 (5 6(2 3) 4 )3) '(2 3) )
Ответить с цитированием
  (#11 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.12.2006, 19:15

Во-первых, сравним два высказывания:
1)
"...Только вот почему-то эта функция всегда NIL выдает."
2)
> (sublist '(1 (2 3)) '(2 3))
T
"...У меня всё так!"

Во-вторых, эта функция для этой задачи (см. VH Дата 29.11.2006, 16:43) и не должна проверять на "бОльшую вложенность". Следует сформулировать другую задачу - тогда можно будет искать ее решение.
Ответить с цитированием
  (#12 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 508
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 23.01.2007, 13:06

Код:
(defparameter *success* nil)

(defun sublist-check (x y)
  (if *success*
      t
      (when x
        (unless (atom (car x))
          (if (equal (car x) y)
              (setq *success* t)
              (sublist-check (car x) y)))
        (sublist-check (cdr x) y))))

(sublist-check '(1 (5 6(2 3) 4 )3) '(2 3))
T

NB: sublist-check одноразовая
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 23.01.2007, 17:34

Код:
(defun SUBSUBLIST (L1 L2)
  (if L1
   (cond
    ((equal L2 (car L1)))
    ((atom (car L1)) (SUBSUBLIST (cdr L1) L2))
    (T (or (SUBSUBLIST (car L1) L2) (SUBSUBLIST (cdr L1) L2))))))
Код:
(defun SUBSUBLIST (L1 L2)
  (if L1
   ((lambda (head tail)
     (cond
      ((equal L2 head))
      ((atom head) (SUBSUBLIST tail L2))
      (T (or (SUBSUBLIST head L2) (SUBSUBLIST tail L2)))))
    (car L1)
    (cdr L1))))
Ответить с цитированием
  (#14 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 508
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 11.03.2007, 16:06

Код:
(defun subp (w v)
  (when w ((lambda (a d)
             (if (atom a)
                 (subp d v)
                 (or (equal a v) (subp a v) (subp d v))))
           (car w) (cdr w))))
Код:
(defun subp (w v)
  (when w ((lambda (a d)
             (cond ((atom a)(subp d v))
                   ((or (equal a v) (subp a v) (subp d v)))))
           (car w) (cdr w))))
(subp '(((j k) c (r p)) (u (r (m t) (a z) d) z)) '(a z))
T
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл словарь. Написать функцию, возвращающую слова заданной длины (турбо паскаль) Андрюня Pascal 0 16.05.2011 11:43
Напишите функцию от двух аргументов x и n Sve234 Lisp 8 31.01.2011 13:36
Написать функцию от двух аргументов x и n Sve234 Вопросы начинающих программистов 0 30.01.2011 12:16
Определить функцию, возвращающую наименьший элемент vital' Lisp 0 19.01.2011 20:58
Написать функцию четырёх аргументов,формирующую список Nastya* Lisp 4 30.09.2010 11:21
Определите функцию, зависящую от двух аргументов u и v lenochka90 Lisp 1 24.09.2010 14:21
Написать LISP-функцию update от трёх аргументов malvina Lisp 5 22.06.2010 22:43
Определить функцию, возвращающую список I_love_lisp Lisp 2 29.05.2010 00:47
Написать функцию аргументов L1 и L2, возвращающую Т yarus Lisp 3 13.04.2009 21:15
Определить функцию с двумя списками в качестве аргументов [ZeoN] Lisp 19 23.05.2007 23:55
Определить функцию семи аргументов zerom Lisp 2 19.02.2007 16:12
Напишите функцию для двух аргументов imported_Irinka Lisp 4 27.03.2004 05:36



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