0

的任务是(在练习 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 的第一个参数必须是单参数函数,我不确定如何使用 map这个目的。我该如何进行?

编辑以更正输出

4

1 回答 1

2

map我们可以通过组合and来解决这个问题filter,但首先要记住这一点:

  • 您不能使用 just 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))
于 2014-12-11T02:34:17.537 回答