2013-03-22 19 views
3

我目前正在使用MIT方案开展家庭作业任务,并且遇到了几个很短的问题,尽管我对如何实现其中的一些问题有些困惑。计划 - 带过滤器的列表函数

一个问题要求我编写一个函数,该函数返回一个删除了所有整数的列表。我还是设法解决这个问题,

(define (f2a lst) (map (lambda(x) (remove number? x)) lst)) 

虽然我很困惑,我该怎么把它改写为不使用删除,而是使用一个过滤器。 *备注:(f2a '(("a" 1 "b") (2 "c") (-1 "d") (-2)))返回'(("a" "b") ("c") ("d"))

另外两个问题是我没有找到任何解决方案的问题。

他们问我编写一个函数,返回一个列表,其中包含所有正奇数和负偶数整数。例如,

(f2b '(("a" 1 "b") (2 "c") (-1 "d") (-2))) 

回报

(("a" "b") (2 "c") (-1 "d")) 

我有一些代码下来是不正确的,但我觉得说明我是如何试图接近解决这一个:

(define (f2b lst) 
    (lambda(x) 
    (cond ((and (positive? x) (odd? x)) (filter x lst)) 
     ((and (negative? x) (even? x)) (filter x lst)) 
     (else "this should never print")))) 

最后问题只是要求一个函数返回一个由列表中所有字符串组成的字符串。 (f2c '(("a" 1 "b") (2 "c") (-1 "d") (-2)))返回“abcd”。

我几乎设法找出这一个,但当它不断返回奇怪的值时卡住了。这是我的代码:

(define (f2c lst) 
    (lambda(x) 
    (map (lambda (x) (filter string? x)) lst) 
    (list x)) 
    (string-append (car lst) (cdr lst))) 

就高阶语法而言,我仅限于映射,过滤,累加和求和。我不是要求直接回答,而是帮助我弄清楚我需要做什么。我在做什么错我的代码?任何援助与此非常赞赏。谢谢。

+0

[文档](http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Filtering-Lists.html#Filtering-Lists)for'remove'说,“Like过滤器,除了返回的列表仅包含那些不满足谓词的元素。“因此,要使用'filter'而不是'remove',只是否定谓词。 – 2013-05-09 19:50:19

回答

1

输入和期望输出的结构在前两个问题中是相同的;唯一不同的是谓词何时何时不移除元素。对于第二种情况下,这将是:

(define (f2b lst) 
    (map (lambda (sublst) 
     (remove (lambda (x) 
        (and (number? x) 
         (or (and (positive? x) (odd? x)) 
          (and (negative? x) (even? x))))) 
       sublst)) 
     lst)) 

由于只有谓词有所不同,你可以概括这个为:

(define (f2x predicate) 
    (lambda (lst) 
     (map (lambda (sublst) (remove predicate sublst)) lst))) 
    (define f2a (f2x number?)) 
    (define f2b (f2x (lambda (x) 
        (and (number? x) 
          (or (and (positive? x) (odd? x)) 
           (and (negative? x) (even? x)))))) 

为了您的最后一个问题,你可以使用的第一个问题的结果

(define (f2c lst) 
    (apply string-append (apply append (f2a list)))) 

此外,请注意您的语法f2b和f2a是不正确的。您正在使用

(define (func arg) 
    (lambda (x) ...)) 

这意味着(func arg)返回的功能不是你想要的。

+1

感谢您解释一些事情,尽管我注意到有两件事情是关闭的:对于f2b代码,它看起来并不完全正常,因为它在运行时会检查一个字符串的整数值并返回一个错误(即对象“派”,作为第一个参数传递给整数负数?,是不正确的类型) 。此外,对于您在f2c列表中发布的代码,我无法评论这是否正确,因为在当前我正在使用的课程中,我们还没有足够使用这样的代码。 – CodeRook 2013-03-22 15:39:28

+0

我已添加号码?到谓词。 – GoZoner 2013-03-22 15:42:46