返回给定值和给定列表的前身

时间:2019-11-18 22:18:50

标签: 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))的递归,我就“失去了关于前任值的信息” ...例如,我不知道将该信息“存储”在列表。

感谢您的帮助!我已经尝试了几个小时...

1 个答案:

答案 0 :(得分:2)

因此,这是解决此问题的方法。您使一个需要其他参数的助手。其中一个可以是上一个元素。例如。

(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将它们作为内部过程实现,也可以使用命名为let的过程。然后,您可以在助手中省略value,因为您可以通过作用域访问它。

祝你好运!