所以我有一个功能:
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
列表的尾部来递归地遍历该列表,并将其传递给函数,因此最终无法再访问这些头。 >
有什么办法可以避免这种情况?还是有什么方法可以遍历列表而不会每次都掉头?
先谢谢您!
答案 0 :(得分:3)
是的,您需要为此引入一个额外的参数,如@coredump建议的那样。
因此,您最终将得到一个累加器prod
,其中将包含要构建的结果,一个要处理的规则队列,这些规则将在递归的每一步中减小大小(当前名称为rules
您的版本)和将包含所有规则(以您明确删除的规则为模)的rules
。