我Tasked (in exercise 8)创建了一个中级学生语言(Racket)中的函数,该函数接收一个数字列表和一个数字列表列表;每个列表的长度相同。命名第一个列表断点和第二个LoR(行列表)。此函数应使用map定义,并应过滤LoR中的每一行,以便只有大于LoR中第n行的数字才包含大于断点中第n个值的值 - 这是一个示例为清楚起见:
(define breakpoints (list 7 2 15))
(define LoR (list (list 3 25 13)
(list 1 2 11)
(list 22 4 8)))
会输出......
(list (list 25 13) (list 11) (list 22))
在不使用地图的情况下这样做会很好,我从这个意义上理解问题,但我无法弄清楚如何使用地图。我认为,如果行列表不为空,我会将(过滤后的第一行)用于(使用其余断点和LoR的函数的递归调用),如下所示:
(define (parallel-filter breakpoints LoR)
(cond((empty? breakpoints) empty)
(else (cons ...
(parallel-filter (rest breakpoints) (rest LoR))))))
但是,我不确定如何用一个能使函数正常工作的map语句替换椭圆 - 据我所知,map的第一个参数必须是单参数函数而且I&I #39;我不确定如何将地图用于此目的。我该怎么办?
编辑以纠正输出
答案 0 :(得分:2)
我们可以通过合并map
和filter
来解决这个问题,但请首先牢记这一点:
map
,因为总是会返回与原始列表长度相同的列表。要排除某些元素,我们必须使用filter
(或者:使用foldr
来实现我们自己的filter
版本)map
可以接收多个列表作为参数,只要其功能接收到足够的参数 - 每个列表中的一个考虑到以上所有因素,这是一个可能的解决方案:
(define (parallel-filter breakpoints LoR)
(map (lambda (brk lst) ; `brk` is from `breakpoints` and `lst` is from `LoR`
(filter (lambda (ele) (> ele brk)) ; filter each sublist from `LoR`
lst))
breakpoints
LoR))
按预期工作:
(parallel-filter breakpoints LoR)
=> (list (list 25 13) (list 11) (list 22))