清单程序(方案)

时间:2013-10-30 23:02:32

标签: list scheme procedure

我正在编写一个程序,它返回一个包含所有负奇数和正数的列表 通过在原始过滤器过程中使用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))))) 

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

1 个答案:

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

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