我正在尝试定义一个带有两个输入的函数,其输出将是一个列表,表示函数下给定子集的图像。我期待它最终看起来像这样:
(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)。
谢谢,我已经坚持了一段时间了。我很感激帮助。
答案 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
功能,则easy至implement 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)))