如何遍历列表而不丢失元素

问题描述 投票:0回答:1

所以我有一个功能:

let rec add_rules start rules prod =
  match rules with
  | [] -> prod
  | nonterm::lst -> 
      if fst nonterm = start then 
        add_rules start (List.remove_assoc (fst nonterm) rules) (nonterm::prod)
      else if check_sym (fst nonterm) prod then 
        add_rules start (List.remove_assoc (fst nonterm) rules) (nonterm::prod)
      else 
        add_rules start lst prod

它需要一个名为

start
的元素、一个名为
rules
的对列表,其中
(x,[y])
x
是一个元素,
y
是一个列表,以及一个空列表
prod

在不详细了解该函数的细节的情况下,我基本上希望它遍历对列表(

rules
)并将某些元素添加到空列表
prod

问题:在前两个if/else if语句中,我的代码成功删除了与

(fst nonterm)
对应的对,并将整个原始列表(减去
(fst nonterm)
)传递回递归函数。然而,在最后一个 else 语句中,我通过调用原始
rules
列表的尾部,将其传递给函数来递归地遍历列表,因此最终无法再次访问这些头。

有什么办法可以避免这种情况吗?或者有什么方法可以遍历列表而不每次都摆脱头部?

提前谢谢您!!!

ocaml
1个回答
3
投票

是的,您需要为此引入一个额外的参数,正如 @coredump 所建议的那样。 因此,您最终将得到一个累加器

prod
,其中包含您正在构建的结果,一个要处理的规则队列,该队列的大小随着递归的每一步而减小(当前在您的版本中名为
rules
)并且
rules
将包含所有规则(以您明确删除的规则为模)。

© www.soinside.com 2019 - 2024. All rights reserved.