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

时间:2018-10-05 08:22:51

标签: ocaml

所以我有一个功能:

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列表的尾部来递归地遍历该列表,并将其传递给函数,因此最终无法再访问这些头。 >

有什么办法可以避免这种情况?还是有什么方法可以遍历列表而不会每次都掉头?

先谢谢您!

1 个答案:

答案 0 :(得分:3)

是的,您需要为此引入一个额外的参数,如@coredump建议的那样。 因此,您最终将得到一个累加器prod,其中将包含要构建的结果,一个要处理的规则队列,这些规则将在递归的每一步中减小大小(当前名称为rules您的版本)和将包含所有规则(以您明确删除的规则为模)的rules