我熟悉递归过程,但是某种程度上我无法解决该问题:我想为给定列表返回一个前值。
(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))的递归,我就“失去了关于前任值的信息” ...例如,我不知道将该信息“存储”在列表。
感谢您的帮助!我已经尝试了几个小时...
答案 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
,因为您可以通过作用域访问它。
祝你好运!