2013-10-30 35 views
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))))) 

我也不能确定我怎么能在同一时间同时应用的筛选过程。

回答

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变得有点难以阅读对我的口味......


好吧,显然你已经嵌套的列表。所有您需要做的,是mapfilter用一个函数,它的结果是:

  • 时给出一个列表,返回(f2b lst)
  • 否则,返回元素不变。

我会离开它作为一个练习你,因为,如果你认为我的函数可以嵌套列表上可能的工作,显然你有很多做学习的......

+0

我尝试运行此代码,但它只是通过我的测试用例并打印整个列表。编辑:我应该澄清,我通过嵌套列表运行它。 – user2789945

+0

@ user2789945:你运行了我给的最后一个函数?你给了它什么输入? – Claudiu

+0

是的,它适用于常规列表,但是当我通过它通过一个嵌套列表,它打印的整个列表。 – user2789945