【问题标题】:Defining a Scheme Image function定义方案图像函数
【发布时间】:2015-04-13 22:58:04
【问题描述】:

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

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

谢谢,我在这个问题上已经坚持了一段时间了。感谢您的帮助。

【问题讨论】:

    标签: scheme discrete-mathematics


    【解决方案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)))
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2014-05-30
      • 1970-01-01
      • 2011-06-15
      • 2014-10-07
      相关资源
      最近更新 更多