1

我是 Scheme 新手,目前没有使用(Racket 版本),因此我没有过滤器等内置功能。

我现在的任务是从我输入的列表中取出元素,并且只取出那些高于我的MinValue和低于我的MaxValue的元素

例如,在我的“lst”变量中,我有(2 4 1 6 5 4 7 3)

在我的MinValue我有2

在我的MaxValue我有5

所以现在在我应用类似的东西之后

 (remove (< # minVal) lst)

从技术上讲,它应该删除并排除:

(2 4 4 3)

但我收到错误:

READ from #<INPUT CONCATENATED-STREAM #<INPUT STRING-INPUT-STREAM> #<IO TERMINAL-STREAM>>: objects printed as # in view of *PRINT-LEVEL* cannot be read back in

主要问题:

Scheme 是否有一个特定的定义变量,例如 # 在使用 remove/remove-if 函数时迭代列表,所以我可以使用它?

有没有办法让它以这种方式工作:

(remove (< # minVal) lst)

谢谢!

标签“作业”应该在那里,但我还不能创建它

4

1 回答 1

0

我知道的几乎所有方案都包含一个filter过程,它不是特定于 Racket,你应该能够使用它(remove不是这项工作的正确工具)。

只需传递lambda依次接收每个元素的 a ,您就可以设置任何条件来确定哪些元素进入输出列表:

(filter (lambda (e) (and (>= e 2) (< e 5)))
        '(2 4 1 6 5 4 7 3))

=> '(2 4 4 3)

没有#变量可以遍历列表并依次为您提供每个元素,为此您必须使用递归显式遍历列表,或使用需要列表和 lambda 的内置过程之一 - lambda 的参数代表每个元素。

如果由于某种原因不允许使用filter,从头开始实现它很容易,并且再次注意我们不需要使用remove,并且pred每个元素都会调用它:

(define (filter pred lst)
  (cond ((null? lst) '())
        ((pred (car lst))
         (cons (car lst) (filter pred (cdr lst))))
        (else (filter pred (cdr lst)))))
于 2016-11-23T18:49:13.867 回答