定义Scheme Image函数

时间:2015-04-13 22:58:05

标签: scheme discrete-mathematics

我正在尝试定义一个带有两个输入的函数,其输出将是一个列表,表示函数下给定子集的图像。我期待它最终看起来像这样:

(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 个答案:

答案 0 :(得分: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功能,则easyimplement one。更好的是,如果您的翻译恰好是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)))