Question

Je vais le livre « Little Schemer », et de faire les différentes fonctions. En général, je me retrouve avec la même version que les livres, mais pas pour eqlist ?, qui est une fonction pour tester l'égalité de deux listes.

J'ai essayé de tester ma version et il passe tout ce que je jette à elle. Pourtant, il est un peu différent de la « Little Schemer version », et je voudrais l'avis de quelqu'un si je manque quelque chose -. Je soupçonne que ce soit le cas

Ma version:

(define eqlist?
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2))#t)
      ((or (null? list1)(null? list2))#f)
      ((and (atom? list1)(atom? list2))(eqan? list1 list2))
      ((or (atom? list1)(atom? list2)) #f)
      (else
        (and(eqlist? (car list1) (car list2))
            (eqlist? (cdr list1) (cdr list2)))))))

La version du livre:

(define eqlist2? ;This is Little Schemer's version
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2)) #t)
      ((or (null? list1)(null? list2)) #f)
      ((and (atom? (car list1))(atom? (car list2)))
       (and (eqan? (car list1)(car list2))(eqlist2? (cdr list1)(cdr list2))))
      ((or (atom? (car list1))(atom? (car list2))) #f)
      (else
       (and (eqlist2? (car list1)(car list2))
            (eqlist2? (cdr list1)(cdr list2)))))))

Et dans les deux cas, la définition de eqan est:

(define eqan?
  (lambda (a1 a2)
    (cond
      ((and (number? a1)(number? a2)) (equal? a1 a2))
      ((or (number? a1)(number? a2)) #f)
      (else (eq? a1 a2)))))

Merci!

Joss Delage

Était-ce utile?

La solution

La version du livre briserait si elle est adoptée dans un atome ou une liste non conforme (une paire qui n'est pas une liste - quelque chose comme (1 2 . 3)) comme argument. (Notez qu'il fonctionne avec '(), bien sûr -. Pas sûr si TLS considère cela comme un atome ou non) Cela rend votre fonction en fait plus robuste, mais peut-être mieux nommé eqv? / equal? que eqlist?. (Je vois equal? est utilisé dans eqan? pour tester l'égalité numérique, mais traditionnellement ce nom est attaché à une fonction de test d'égalité de valeur universelle.)

En gros, votre eqlist? fonctionne sur tous les types d'arguments sous les hypothèses (1) atom? est en mesure de dire paires (choses avec car et cdr) des non-paires (c'est la version Négation de pair?), (2) eqan? teste l'égalité des atomes de carbone, (3) tout est soit '() ou une paire ou un atome. (Eh bien, en fait '() est un atome dans mes yeux -. Et Petite Chez Scheme est d'accord). La version du livre fonctionne sur les listes appropriées (y compris '()), fait des hypothèses similaires et ne tient pas compte de la possibilité de rencontrer une liste incorrecte

Je ne serais pas surpris si une fonction de test d'égalité plus robuste a été présenté plus tard dans le livre, mais je ne l'ai pas disponible pour vérifier. Quoi qu'il en soit, la version livre de eqlist? vous semble que quelque chose posté destiné à illustrer les idées de base derrière les listes, et non pas quelque chose que vous voulez utiliser dans la programmation au jour le jour. En fait, la version donnée de eqan? briserait dans un environnement ouvert où il y a plus de types de données atomiques à considérer, parmi lesquels les cordes très moins devraient être comptabilisés séparément, invalidant ainsi les hypothèses énumérées au deuxième alinéa ci-dessus et briser les deux versions de eqlist?.

Autres conseils

Voici ma version:

(define eqlist?
    (lambda (l1 l2)
      (cond
        ((and (null? l1) (null? l2))
         #t)
        ((and (atom? (car l1)) (atom? (car l2)))
         (and (eq? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2))))
        (else
         (and (eqlist? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2)))))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top