定义 Scheme Image 函数
Defining a Scheme Image function
我正在尝试定义一个函数,该函数接受两个输入,其输出将是一个列表,表示该函数下给定子集的图像。我希望它最终看起来像这样:
(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)))))
根据这些输入,image 的输出应该是一个列表,表示该函数下给定子集的图像。另外,我想删除所有重复项,以便一个数字只显示一次(因此示例结果是 (6 4) 而不是 (4 6 4)。
谢谢,我已经坚持了一段时间了。感谢您的帮助。
一个简单的解决方案是根据基本列表函数滚动您自己的 filter/map 帮助程序,然后删除重复项:
(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 to 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)))
我正在尝试定义一个函数,该函数接受两个输入,其输出将是一个列表,表示该函数下给定子集的图像。我希望它最终看起来像这样:
(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)))))
根据这些输入,image 的输出应该是一个列表,表示该函数下给定子集的图像。另外,我想删除所有重复项,以便一个数字只显示一次(因此示例结果是 (6 4) 而不是 (4 6 4)。
谢谢,我已经坚持了一段时间了。感谢您的帮助。
一个简单的解决方案是根据基本列表函数滚动您自己的 filter/map 帮助程序,然后删除重复项:
(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 to 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)))