функция [создает] массив с именем seen
[…], [создает] очередь с именем treated
[…], [и обновляет] значение узла s
в массивеseen
.
[Тогда] мы вызываем здесь рекурсивную функцию с именем add_neighbors
, но эта функция ждет здесь аргумента, но какой аргумент мы даем этой функции?
Нет, let rec add_neighbors = function
не вызывает функцию. объявляет локальную переменную add_neighbors
со значением функции, а затем позволяет использовать эту переменную in
в следующем блоке.
Как алгоритм продолжает отсюда?
Следующее, что выполняет алгоритм, это блок
try while true do
let s = Queue.take treated in
print_int s ;
add_neighbors g.(s)
done
with Empty -> ()
В бесконечном цикле он берет первый узел из очереди treated
, печатает его и затем вызывает add_neighbors
с теми, которые предположительно являются соседями узла s
.Этот вызов g.(s)
(или Array.get g s
) предполагает, что g
относится не к типу graph
, а к массиву списков, причем индекс массива является идентификатором узла, из которого происходят некоторые ребра, а значения списка являются узломИдентификатор того, куда указывают ребра.
Этот бесконечный цикл заканчивается, когда операция Queue.take
выдает исключение Empty
, которое перехватывается и обрабатывается бездействием.Я бы сказал, что лучше вместо этого написать
while not (Queue.is_empty treated) do
let s = Queue.take treated in
print_int s ;
add_neighbors g.(s)
done