for all n, in[n] = out[n] = Ø
w = { set of all nodes }
repeat until w empty
n = w.pop( )
out[n] = ∪ n’ ∈ succ [n] in[n’]
in[n] = use[n] ∪ (out[n] — def [n])
if change to in[n],
for all predecessors m of n, w.push(m)
end
Мне трудно сказать, что именно здесь происходит. Я думаю, что с вашим текстом есть некоторые проблемы с выравниванием - repeat until w empty
должно повторять следующие 5 строк, верно? А как функции in и out выглядят для меня как массивы? Помимо этих недостатков, я рассмотрю некоторые общие правила, которым я следовал.
Мне пришлось перевести ряд численных методов в алгоритмах C и Fortran на функциональные языки, и у меня есть несколько советов для вас.
0) Определите используемые типы данных. Это действительно поможет вам в следующем шаге (спойлер: поиск функциональных конструкций). Зная типы данных, вы сможете более точно определить функциональные конструкции, которые вы в конечном итоге примените.
1) Ищите функциональные конструкции. фолд, рекурсия и карты, и когда их использовать. Например, for all predecessors m
- это сгиб (не уверен, что он будет сгибаться по дереву или списку, но, тем не менее, сгиб). Циклы While
являются хорошим местом для рекурсии - но не беспокойтесь о том, чтобы сделать это хвостовым вызовом, вы можете изменить параметры позже, чтобы соответствовать этим требованиям. Не беспокойтесь о чистоте на 100%. Удалите достаточно нечистых конструкций (ссылок или массивов), чтобы получить представление о алгоритме функциональным образом.
2) Напишите любую часть алгоритма, которую вы можете. Оставьте функции пустыми, добавьте фиктивные значения и просто реализуйте то, что знаете, - тогда вы сможете задавать ТАК более качественные, более информированные вопросы.
3) Переписать это. Есть большая вероятность, что вы пропустили некоторые функциональные конструкции или использовали массив или ссылку, где теперь вы понимаете, что можете использовать список или набор или передавая аккумулятор. Возможно, вы определили список, но позже вы понимаете, что не можете получить к нему произвольный доступ (ну, это было бы довольно вредно), или его нужно перемещать вперед и назад (хорошее место для молнии). В любом случае, когда вы, наконец, получите это, вы будете знать, и у вас должна быть огромная ухабистая улыбка на лице.