> 1 <

Автор Сообщение

Viktoria777

Members


Статус

2 сообщений

Где: Russia
Род занятий:
Возраст:

#6850   2012-12-25 22:45 GMT+3 часа(ов)      
Нужно написать программу используя рекурсию. Например дано два списка ( a b c d e) и (a b c). Нужно определить или второй список есть подсписком первого.

netrino

Members


Статус

3 сообщений

Где: Russia
Род занятий:
Возраст:

#6852   2012-12-26 00:04 GMT+3 часа(ов)      
Можно вот так, например.
 
(defun sublist-p (list-1 list-2 &optional (equals #'equal))
(labels ((begins-with-p (list-1 list-2)
(cond
((null list-1) (null list-2))
((null list-2) T)
((funcall equals (car list-1) (car list-2))
(begins-with-p (cdr list-1) (cdr list-2)))
(T nil))))
(cond
((null list-1) nil)
((null list-2) T)
((funcall equals (car list-1) (car list-2))
(or (begins-with-p list-1 list-2)
(sublist-p (cdr list-1) list-2)))
(T (sublist-p (cdr list-1) list-2)))))
 


 
CL-USER> (sublist-p '(a b c d e f) '(c d e))
T
CL-USER> (sublist-p '(a b c d e f) '(c d r))
NIL
 

Viktoria777

Members


Статус

2 сообщений

Где: Russia
Род занятий:
Возраст:

#6853   2012-12-26 00:58 GMT+3 часа(ов)      
Огромное спасибо. Выручили

Файфель Б.Л.

Members


Статус

61 сообщений
http://homelisp.ru
Где: Russia Саратов
Род занятий: Программист
Возраст: 67

#6930   2013-02-25 14:39 GMT+3 часа(ов)      
Больно сложно...
Так проще:
 
(defun is-sublist (lst1 lst2)
(cond ((null lst1) t)
((null lst2) nil)
((equal (car lst1) (car lst2))
(or (is-sublist (cdr lst1) (cdr lst2))
(is-sublist lst1 (cdr lst2))))
(t (is-sublist lst1 (cdr lst2)))))
==> is-sublist
(is-sublist '(c d r) '(a b c d e f) )
==> NIL
(is-sublist '(c d e) '(a b c d e f) )
==> T
 

отредактировал(а) Файфель Б.Л.: 2013-03-23 00:14 GMT+3 часа(ов)

Файфель Б.Л.

Members


Статус

61 сообщений
http://homelisp.ru
Где: Russia Саратов
Род занятий: Программист
Возраст: 67

#6931   2013-02-25 14:48 GMT+3 часа(ов)      
А можно и вот так:
 
(defun is-sublist (lst1 lst2)
(let ((l (length lst1)))
(apply 'or
(maplist
#'(lambda (x) (if (> (length x) l) (equal lst1 (subseq x 0 l)) nil)) lst2))))
==> is-sublist
(is-sublist '(c d e) '(a b c d e f) )
==> T
(is-sublist '(c d e r) '(a b c d e f) )
==> NIL
 

отредактировал(а) Файфель Б.Л.: 2013-03-23 00:15 GMT+3 часа(ов)
> 1 <


Онлайн :

0 пользователь(ей), 39 гость(ей) :