Как пройти список без потери элементов - PullRequest
0 голосов
/ 05 октября 2018

так что у меня есть функция:

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 голосов
/ 05 октября 2018

Да, вам нужно ввести дополнительный параметр для этого, как предложил @coredump.Таким образом, вы получите аккумулятор prod, который будет содержать созданный вами результат, очередь правил для обработки, которая уменьшается в размере с каждым шагом рекурсии (в настоящее время называется rules в вашей версии) иrules, который будет содержать все правила (по модулю тех, которые вы явно удалили).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...