DrRacket:如何删除列表中 greater/lower 大于特定数字的元素

DrRacket: How to remove elements in a list that are greater/lower than a certain number

我正在尝试编写一个将列表作为输入的小程序,第一个函数应该删除大于 4 的值,另一个函数应该删除列表中小于 4 的值检查预期。我认为这是一个简单的解决方案,但我似乎无法弄清楚,因为我对列表和数据结构还是陌生的。任何帮助将不胜感激,这是代码:

(define (removehigher lon n)
  (cond [(> n lon)(remove (lon))]
        [(< n lon) true]))

(define (removelower lon n)
  (cond [(> n lon) true]
        [(< n lon) (remove(lon))]))

(check-expect(removehigher(list 0 1 2 3 4 5 6)4)(list 0 1 2 3))
(check-expect(removelower(list 0 1 2 5 6 7) 3)(list 5 6 7))

有一个名为 filter 的函数可以执行此操作。

(define (my-filter pred lst (acc '()))
  (cond [(null? lst) (reverse acc)]
        [(pred (car lst)) (my-filter pred (cdr lst) (cons (car lst) acc))]
        [else (my-filter pred (cdr lst) acc)]))

它实际上是一个内置函数filter。我使用 my- 作为前缀,以免覆盖此内置函数。

一旦你有了函数filter(或my-filter),你就可以很容易地写出你想要的函数——然后就是为它正确定义谓词函数(pred)每个案例:

(define (remove-higher lst n)
  (filter (lambda (x) (<= x n)) lst))

(define (remove-lower lst n)
  (filter (lambda (x) (<= n x)) lst))

或者,也可以使用 append-map:

(define (remove-higher lst n)
  (append-map (lambda (x) (if (<= x n) (list x) '())) lst))

(define (remove-lower lst n)
  (append-map (lambda (x) (if (<= n x) (list x) '())) lst))

或使用 append-map 定义 filter:

(define (my-filter pred lst)
  (append-map (lambda (x) (if (pred x) (list x) '())) lst))

append-map依次可以定义:

(define (my-append-map func lst)
  (apply append (map func lst)))