Scheme 返回给定值和给定列表的前置项

Scheme 返回给定值和给定列表的前置项,scheme,lisp,racket,Scheme,Lisp,Racket,我熟悉递归过程,但不知何故我无法解决这个问题:我想为给定列表返回一个前置值 (define (pred value lst) ...) (pred 3 (list 8 3 7 3)) should return 8 (pred 2 (list 1 2 2 2 2)) should return 1 请注意,我只想返回前置项的“第一次”出现,因此在第一个示例中,不必返回数字7 我现在被卡住了,因为一旦我调用递归(pred value(rest lst)),我就“丢失了关于前置值的信息”

我熟悉递归过程,但不知何故我无法解决这个问题:我想为给定列表返回一个前置值

(define (pred value lst)
    ...)

(pred 3 (list 8 3 7 3)) should return 8
(pred 2 (list 1 2 2 2 2)) should return 1
请注意,我只想返回前置项的“第一次”出现,因此在第一个示例中,不必返回数字7

我现在被卡住了,因为一旦我调用递归(pred value(rest lst)),我就“丢失了关于前置值的信息”。。。我不知道如何将这些信息“存储”在列表中


谢谢你的帮助!我已经试了几个小时了…

下面是如何解决这个问题的。您创建了一个接受附加参数的帮助器。其中一个可以是前一个元素。例如

(define (iterate-pred value last lst)
  ...)

(pred 3 '(1 2 3 4))         ; ==> 
(iterate-pred 3 1 '(2 3 4)) ; ==> 
(iterate-pred 3 2 '(3 4))   ; ==> 
; ==> 2
因此,要更新变量,只需使用新值再次调用相同的过程。这就像迭代列表一样简单,它使用相同的策略

您可以使用
define
/
letrec
或使用named
let
作为内部过程来实现这些。然后,您可以省略帮助器中的
,因为您可以通过作用域访问它


祝你好运

你能给我们看看你的作品吗?你尝试了什么?你在哪里卡住了?当我们不知道您的实际问题时,很难帮助您。请注意,此函数确实需要返回三个值:前置值,是否有前置值?我们的单子用完了吗?您可以将第二个两个值折叠为一个,但我认为没有真正的需要。@tfb就像
car
一样,
+
需要返回2个值,以防给出错误的数据?额外的一英里是使用
(error'notfound“element not found”)
,而不是在
()
上得到一个类型错误。如果未找到某个值,则确定该值也可以,只要该值未指定,但
(pred'test'(#f test))
可能会返回与
(pred'test2'(#f test))
@sylvester:不,根本不像
+
(+1'a)
是一个错误,但
(pred'a'(ab)
不是:它应该有一种说“没有前置程序”的方式,就像CL中的
gethash
一样。这就是多个值在许多情况下的作用:提供一些您可能关心的额外信息,而不必经历发送错误信号的巨大开销。至少,即使Racket对多个值过于挑剔,以至于让它们在实践中几乎毫无用处。@Sylvester:哦,是的,我不明白你对
汽车
的想法:我可以用Lisp,其中
(汽车x)
返回两个值:汽车(或
nil
),如果
x
()
,否则为真,只要
x
不是cons或
()
(但仅在类似CL的语言中,可以忽略附加值)时,它继续发出错误信号我想如果不给出函数实现的示例,我很难在这里描述我的函数问题,我不想在这里这样做,原因很明显。我无法实现您的提示。我很抱歉…(定义(pred-value-lst)(迭代pred-value(first-lst)(pred-value(rest-lst)))@rzume不应该调用
pred
from
iterate pred
应该是
(define(pred value lst)(iterate pred value(car lst)(cdr lst))
,当然
iterate pred
应该只调用自身而不是
pred