3

我目前正在使用 MIT 计划进行家庭作业,并且遇到了一些据说很短的问题,尽管我对如何实现其中一些有点困惑。

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

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

尽管我对如何将其重写为不使用 remove 而是使用过滤器感到困惑。*注:(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)))

在高阶语法方面,我仅限于映射、过滤、累加和求和。我不是要直接回答,而是要一些帮助来帮助我弄清楚我需要做什么。我的代码做错了什么?非常感谢您对此提供的任何帮助。谢谢你。

4

1 回答 1

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)返回的函数不是您想要的。

于 2013-03-22T15:31:55.567 回答