0

这是“编程语言语用学,迈克尔·斯科特”的练习。

Q. 返回一个列表,其中包含给定列表中满足给定谓词的所有元素。例如, (filter (lambda (x) (< x 5) '(3 9 5 8 2 4 7)) 应该返回 (3 2 4)。

我认为这个问题不仅需要满足上述每个谓词的功能。但我没有任何想法来实现这样的功能。请帮忙。

4

1 回答 1

3

filter过程已经存在于大多数 Scheme 实现中,它的行为符合预期:

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7))
=> '(3 2 4)

现在,如果问题是如何实现它,那就很简单了——我会给你一些提示,这样你就可以自己编写了。这里的技巧是注意到该过程正在接收另一个过程作为参数,一个谓词,它会返回#t#f应用于输入列表中的每个元素。评估为#t的那些保留在输出列表中,评估为的那些#f被丢弃。这是解决方案的骨架,请填空:

(define (filter pred? lst)
  (cond (<???>       ; if the list is empty
         <???>)      ; return the empty list
        (<???>       ; apply pred? on the first element, if it's #t
         (cons <???> ; then cons the first element
               (filter pred? <???>))) ; and advance recursion
        (else (filter pred? <???>)))) ; else just advance recursion
于 2013-04-08T00:11:36.790 回答