2015-04-13 1 views
1

J'essaie de définir une fonction qui prend deux entrées et dont la sortie sera une liste représentant l'image d'un sous-ensemble donné sous la fonction. Je me attends à ressembler à ceci à la fin:Définition d'une fonction Scheme Image

(image '(1 2 3) '((5 4) (3 4) (1 4) (2 6))) ----> (6 4) 

Jusqu'à présent, j'ai écrit quelque chose qui ressemble à ceci:

(define (image subset-of-domain func-pairs) 
    (cond 
    ((empty? (first subset-of-domain)) 
      (null)) 
    ((equal? (first subset-of-domain) (first (first func-pairs))) 
      (rest (first func-pairs))) (else (image (rest subset-of-domain) (rest func-pairs))))) 

De ces entrées, la sortie de l'image doit être liste représentant l'image de ce sous-ensemble donné sous cette fonction. En outre, je veux supprimer tous les doublons de sorte qu'un nombre n'apparaisse qu'une seule fois (d'où le résultat de l'exemple est (6 4) et non (4 6 4)

Merci, j'ai été bloqué sur cela pour un . tout en maintenant j'apprécie l'aide

Répondre

1

Une solution simple serait de rouler votre propre procédure d'aide filtre/carte en termes de fonctions de liste de base et supprimer les doublons.

(define (image subset-of-domain func-pairs) 
    (define (image-helper lst) 
    (cond ((null? lst) '()) 
      ((member (caar lst) subset-of-domain) 
      (cons (cadar lst) (image-helper (cdr lst)))) 
      (else (image-helper (cdr lst))))) 
    (remove-duplicates (image-helper func-pairs))) 

ci-dessus fonctionne très bien , mais ce n'est pas recommandé - fondamentalement, nous réinventerons la roue Une solution beaucoup plus idiomatique consisterait à utiliser (en général) des procédures standard d'ordre supérieur:

(define (image subset-of-domain func-pairs) 
    (remove-duplicates 
    (map cadr 
     (filter (lambda (pair) 
        (member (car pair) subset-of-domain)) 
       func-pairs)))) 

Si votre interprète ne fournit pas une fonction remove-duplicates, il est easy-implementone. Encore mieux, si votre interprète se trouve être Racket, nous pouvons écrire une solution plus courte simplement en utilisant des procédures intégrées:

(define (image subset-of-domain func-pairs) 
    (remove-duplicates 
    (filter-map (lambda (pair) 
       (and (member (first pair) subset-of-domain) 
         (second pair))) 
       func-pairs)))