我正在编写一个程序,它返回一个包含所有负奇数和正数的列表 通过在原始过滤器过程中使用lambda,甚至删除了整数(字符串可以保留)。我也避免使用递归,但这就是让我感到难过的原因。 到目前为止我所拥有的是:
(define (f2b lst)
(cond ((null? lst)'()) ; if the list is empty, return the empty list
((pair? (car lst)) ; if the current element isn't a list
(filter (lambda (x) (or (even? x) (positive? x))) (car lst))
(filter (lambda (x) (or (odd? x) (negative? x))) (car lst)))
(else (string? (car lst)) ;otherwise, if the current element is a string,
(car lst) ; then return that element
(f2b (cdr lst)))))
我也不确定如何同时应用这两种过滤程序。
答案 0 :(得分:0)
这比那简单。您所要做的就是filter
列表。你只需要适当的谓词。
你想什么时候保留元素?你根据要删除的内容来表达它,所以让我们从那开始。如果它是负奇数或正整数,你想要删除它,并将其他所有内容保留。更容易将其分解为更小的函数。
(define (positive-even? x) (and (positive? x) (even? x)))
(define (negative-odd? x) (and (negative? x) (odd? x)))
(define (remove-num? x) (or (positive-even? x) (negative-odd? x)))
这定义是否保留数字。但list元素可能不是数字。所以我们
如果它不是数字,或者它与remove-num?
不匹配,请保留它:
(define (keep-element? x) (or (not (number? x)) (not (remove-num? x))
然后你的函数只需调用filter:
(define (f2b lst) (filter keep-element? lst))
似乎工作:
(f2b '(-4 -3 -2 -1 0 1 2 3 4 "a string" "another"))
=> (-4 -2 0 1 3 "a string" "another")
以下是它看起来像一个很棒的功能:
(define (f2b lst)
(filter
(lambda (x)
(or (not (number? x))
(not (or (and (positive? x) (even? x))
(and (negative? x) (odd? x))))))
lst)
就个人而言,嵌套的or not or and
对我来说有点难以理解......
好的,显然你有嵌套列表。你在这里所要做的只是map
filter
的结果,其功能是:
(f2b lst)
我会把它作为练习留给你,因为如果你认为我的功能可能在嵌套列表上工作,显然你有很多学习要做...