LINUX.ORG.RU

[LISP]Задача

 


0

0

Помогите решить, пожалуйста:

Задача 3.
Написать функцию, генерирующую все циклические перестановки списка. Элементами списка являются списки.
Пример : ((a b)(c d)) ⇒(((a b)(c d))((b a)(c d))((a b)(d c))..).

Задача 4.
Написать функцию, которая возвращает список позиций вхождения списка lst2 в список lst1 и глубину нахождения lst2 в lst1.


Так а в чем затык то? Что именно ты не знаешь для решения задач?

mholub
()
Ответ на: комментарий от nikolayd

из экзаменационных билетов, если верить гуглу. А может кто-то подскажет ту же задачу про перестановки, но на erlang? <_<

Shinigami
()

Я не понял, как пример к задаче 3 соотносится с её условием.
Кроме того, нигде не сказано, какой диалект Лиспа нужен (Common Lisp, Scheme?).

Вот функция, вычисляющая все циклические перестановки списка на Common Lisp. 

CL-USER> (defun for-all-cyclic-permutations (list func)
           (funcall func list)
           (do ((iter (cdr list) (cdr iter))
                (prev list))
               ((not iter))
             (when prev
               (setf (cdr prev) nil)
               (funcall func (append iter list))
               (setf (cdr prev) iter))
             (setf prev iter)))
           
CL-USER> (for-all-cyclic-permutations '(a b c d e) #'print)

(A B C D E) 
(B C D E A) 
(C D E A B) 
(D E A B C) 
(E A B C D) 

CL-USER> (for-all-cyclic-permutations '((a b) (c d)) #'print)

((A B) (C D)) 
((C D) (A B)) 


Вот функция, вычисляющая все комбинации циклических перестановок на Common Lisp: 

CL-USER> (defun for-all-cyclic-permutations-2 (list func)
           (if list
               (for-all-cyclic-permutations-2
                (cdr list)
                (lambda (tail)
                  (for-all-cyclic-permutations
                   (car list)
                   (lambda (head)
                     (funcall func (cons head tail))))))
               (funcall func nil)))

CL-USER> (for-all-cyclic-permutations-2 '((a b) (c d)) #'print)

((A B) (C D)) 
((B A) (C D)) 
((A B) (D C)) 
((B A) (D C)) 

ringill
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.