1

我正在编写一个程序,该程序通过在原始过滤程序中使用 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))))) 

我也不确定如何同时应用这两个过滤程序。

4

1 回答 1

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)))

这定义了是否保留一个数字。但列表元素可能不是数字。所以如果它不是一个数字,或者它不匹配,我们就保留它remove-num?

(define (keep-element? x) (or (not (number? x)) (not (remove-num? x))

然后你的函数只需要调用过滤器:

(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")

以下是它看起来像一个大的 honkin' 功能:

(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)
  • 否则,返回不变的元素。

我将把它作为练习留给你,因为如果你认为我的函数可能在嵌套列表上工作,显然你有很多学习要做......

于 2013-10-30T23:20:30.483 回答