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线,对不对?如何进出功能,他们看起来像阵列给我?除了这些不足之外,我会解决一些我遵循的一般规则。
我不得不将C和Fortran算法中的一些数值方法翻译成函数式语言,我对你有一些建议。
0)定义正在使用的数据类型。这将真正帮助你进行下一步(剧透:寻找功能性结构)。一旦你知道了数据类型,你可以更准确地定义你将最终应用的功能结构。
1)寻找功能结构。折叠,递归和地图,以及何时使用它们。例如,for all predecessors m
是一个折叠(不确定它是否会折叠树或列表,但无所谓,折叠)。 While
循环是一个递归的好地方 - 但不用担心使它成为尾部调用,您可以稍后修改参数以遵守这些要求。不要担心100%纯净。删除足够的不纯的结构(引用或数组)以功能性的方式感受算法。
2)写任何你可以的算法的一部分。将函数留空,添加虚拟值,并只实现你所知道的 - 然后你可以提出更好,更明智的问题。
3)重写它。如果您现在意识到您可以使用列表或设置或通过累加器,您很有可能错过了某些功能性结构或使用了数组或引用。你可能已经定义了一个列表,但后来你意识到你不能随机访问它(对它来说,这会非常不利),或者它需要前后移动(拉链的好地方)。无论哪种方式,当你最终得到它时,你就会知道,而且你的脸上应该有一个巨大的耳朵到耳朵的笑容。
集不支持'pop'。您必须首先了解伪代码中的数据结构是否是“w”,然后才能将其转换为Caml。 – 2009-12-07 12:03:41
我知道弹出我将使用队列模块。所有我感到困扰的是逻辑的变形,所以如果你能帮助我将其转化为逻辑,我将会感激 – 2009-12-08 02:26:07