在方案中映射和过滤

时间:2012-10-27 23:45:25

标签: map filter scheme mit-scheme

我正在尝试返回一个删除了所有字符串的列表

(remove-strings '(("hello" 9) (29 10) ("cruel" "world") (1238 .12) (-53 "end"))))
=> ((9) (29 10) () (1238 .12) (-53))

这是我到目前为止的代码     (define(删除字符串列表)      (过滤字符串?列表))

我也试图在列表中排列所有负数,所以'我有

(define (neg-sqr list)
  (map square (filter negative? list)) ; filters out negatives in list and squares each number
)  

应该回来     2809因为它取每个负数的平方(-53 ^ 2)

但是,上面的代码不起作用。我认为这是因为我需要使用第一步中的代码删除字符串以便我可以单独获取数字,或者是因为这些项目嵌套了一层深度?任何人都可以帮我解决删除字符串程序吗?

3 个答案:

答案 0 :(得分:1)

使用像这样的累积函数:

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

使呼叫正确累积是一件简单的事情。

(define (remove-strings n)
   (accumulate (lambda (x y) (cons (filter number? x) y)) () n)
  )

这样做是重复将程序lambda应用于每个子列表,然后将它们合在一起,留下你的无字符串新列表。

答案 1 :(得分:1)

以下是取消负数的代码

(define (f2b items)
   (accumulate (lambda (x y)
 (cons (append 
    (map square (filter negative? (filter number? x))
)
(filter positive? (filter number? x))
(filter string? x)
) y)) () items))

PS。你弄明白了所有正数的总和吗?

答案 2 :(得分:0)

filter将列表作为参数 但是,您对remove-strings的输入是一个列表列表,您希望单独处理它们 也许你可以找到一种方法将一个函数应用于列表中的每个项目?