【问题标题】:Gathering elements in range of Min and Max values from a list in Scheme从 Scheme 中的列表中收集最小值和最大值范围内的元素
【发布时间】:2016-11-23 17:20:07
【问题描述】:

我是 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)

谢谢!

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

【问题讨论】:

  • 您使用的是哪种方案?这看起来很像 Lisp 错误消息。

标签: list scheme range remove-if


【解决方案1】:

我知道的几乎所有 Scheme 都包含一个 filter 过程,它不是特定于 Racket,你应该可以使用它(remove 不是适合这项工作的工具)。

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

(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)))))

【讨论】:

  • 谢谢!这就解释了!
猜你喜欢
  • 2013-03-26
  • 2016-08-31
  • 2019-02-11
  • 2021-10-10
  • 2014-03-22
  • 2020-10-03
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多