Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > LISP простая рекурсия


Автор: mego4el 21.5.2012, 12:36
необходимо написать маленькую программу, с использованием управляющих форм LISPa.

реализовать: нахождение разности списков R=S1/S2 (элементы всех уровней).
тип рекурсии: параллельное ветвление рекурсии.
форма представление результата: результатом есть список, содержащий исходный и результирующие.

помогите пожалуйста!. спасибо!

Автор: Stolzen 8.7.2012, 12:04
Что значит всех уровней?

Так, может
Код

(define (difference set1 set2)
    (cond
        ((null? set1) null)
        ((element-of-set? (car set1) set2)
            (difference (cdr set1) set2))
        (else
            (cons (car set1) (difference (cdr set1) set2)))
    )
)

(define (element-of-set? x set)
    (cond
        ((null? set) false)
        ((equal? x (car set)) true)
        (else
            (element-of-set? x (cdr set)))
    )
)

Автор: _sg 8.7.2012, 22:01
Код

(defun flat (w &optional acc) 
  (cond ((null w) acc)
        ((atom w) (cons w acc))
        ((flat (car w) (flat (cdr w) acc)))))

(defun wvd (w v)
  (list w v (set-difference (flat w) (flat v))))

> (wvd '(a b (c) d) '((c d) e))
((A B (C) D) ((C D) E) (A B))

Автор: _sg 19.11.2014, 10:40
как вариант:
Код

(defun flat (w)
  (loop for a in w 
        if (and a (atom a)) collect a
        else nconc (flat a)))

(defun wvd (w v)
  (list w v (set-difference (flat w) (flat v))))

> (wvd '(a b (c) d) '((c d) e))
((A B (C) D) ((C D) E) (A B))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)