|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
[LISP] Uguaglianza fra due liste
Ciao a tutti,
sto sbattendo la testa al muro Ho fatto una funzione ausiliaria che date due liste L1 e L2 restituisce T se gli elementi di L1 sono contenuti in L2. Codice:
(DEFUN AUX(L1 L2)(COND ((NULL L1) T)((MEMBER(CAR L1) L2)(AUX(CDR L1)L2))(T NIL))) Ora per testare che L1 = L2 devo verificare che gli elementi di L1 sono contenuti in L2 e che gli elementi di L2 sono contenuti in L1. Per questo ho fatto questa funzione: Codice:
(DEFUN UGUALI(L1 L2)(COND((AND(AUX(L1 L2))(AUX(L2 L1)))T)(T NIL))) Se faccio una prova ottengo un risultato che non riesco a capire: Codice:
> (UGUALI '(A B C) '(C B A)) *** - EVAL: undefined function L1 The following restarts are available: USE-VALUE :R1 You may input a value to be used instead of (FDEFINITION 'L1). RETRY :R2 Retry STORE-VALUE :R3 You may input a new value for (FDEFINITION 'L1). EDIT: Risolto, sbagliavo a mettere le parentesi nei parametri dell'AND: Codice:
(DEFUN UGUALI(L1 L2)(COND((AND (AUX L1 L2) (AUX L2 L1))T)(T NIL))) Ultima modifica di fbcyborg : 05-12-2008 alle 09:01. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Il mio lisp è molto rozzo eh... in scheme farei una roba tipo
Codice:
(define (eq-list? a b)
(cond
((and (null? a)(null? b)) #t)
((or (null? a)(null? b)) #f)
((eq? (car a)(car b)) (eq-list? (cdr a)(cdr b)))
(else #f)))
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers Ultima modifica di shinya : 05-12-2008 alle 12:02. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Ti ringrazio, anche se in realtà ho risolto. Inoltre il mio codice non presuppone che le liste siano di pari lunghezza, funziona comunque. In realtà si suppone però che non ci siano elementi duplicati.
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Con uguali, intendo dire che gli elementi della prima lista sono contenuti nella seconda e quelli della seconda sono contenuti nella prima.
Lo so che non è perfetta, ma per ora è tutto ciò che sono riuscito a fare. L'ordine degli elementi non conta. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Allora la mia versione non va bene :P
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Va bene, vi ringrazio tutti,
ho risolto il mio problema con le informazioni che mi avete dato. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
se vuoi andare sul sicuro anche quando hai elementi ripetuti, ti conviene "toglierti dalle scatole" quelli in cui sei gia' incorso.
Qualcosa del tipo Codice:
(defun uguali (l1 l2) (if (null l1) (null l2) (and (member (first l1) l2) (uguali (cdr l1) (remove (first l1) l2 :count 1))))) se il primo elemento della prima lista appare nella seconda, e quel che resta delle due liste sono uguali Ho usato le funzioni member e remove del common lisp, pero' dovresti trovare l'equivalente nel tuo linguaggio.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:52.





















