方案:我不知道实现给定的功能

时间:2013-04-07 23:18:36

标签: scheme

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

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

我认为这个问题需要的函数不仅满足上述每个谓词。但我不知道实现这样的功能。请帮忙。

1 个答案:

答案 0 :(得分:3)

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

(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