2015-04-13 3 views
1

Я пытаюсь определить функцию, которая принимает два входа и выход которых будет списком, представляющим изображение данного подмножества под функцией. Я ожидаю, чтобы она выглядела, как это в конце:Определение функции изображения схемы

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

До сих пор я написал что-то, что выглядит следующим образом:

(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))))) 

Из этих входов, выход изображения должен быть список, представляющий изображение этого подмножества под этой функцией. Кроме того, я хочу удалить любые дубликаты, чтобы число отображалось только один раз (поэтому почему результатом является результат (6 4), а не (4 6 4).

Спасибо, я застрял на этом ., а теперь я ценю помощь

ответ

1

простое решение было бы свернуть свой собственный фильтр/карту вспомогательной процедуры с точки зрения основных функций списка, а затем удалить дубликаты:.

(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))) 

выше будет работать нормально , но это не рекомендуется - в основном, мы будем изобретать колесо. Более идиоматическим решением будет использование (в основном) стандартных процедур более высокого порядка:

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

Если переводчик не обеспечивает remove-duplicates функцию, это easy к implementone. Еще лучше, если ваш интерпретатор окажется Racket, мы можем написать более короткое решение, просто используя встроенные процедуры:

(define (image subset-of-domain func-pairs) 
    (remove-duplicates 
    (filter-map (lambda (pair) 
       (and (member (first pair) subset-of-domain) 
         (second pair))) 
       func-pairs))) 
Смежные вопросы