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