你想要的是深度优先搜索。
function ExamineField(Field F)
{
if (F.already_in_list)
return
foreach C child of F
{
call ExamineField(C)
}
AddToList(F)
}
然后,只需依次在每个字段上调用ExamineField(),并根据您的规范以最佳顺序填充列表。
请注意,如果字段是循环(也就是说,您有类似于A = B + C,B = A + D的东西),那么必须修改该算法以便它不会进入无限循环。
对于你的榜样,呼叫会去:
ExamineField(A)
ExamineField(B)
ExamineField(C)
AddToList(C)
ExamineField(E)
AddToList(E)
AddToList(B)
ExamineField(D)
ExamineField(B)
(already in list, nothing happens)
ExamineField(C)
(already in list, nothing happens)
AddToList(D)
AddToList(A)
ExamineField(B)
(already in list, nothing happens)
ExamineField(C)
(already in list, nothing happens)
ExamineField(D)
(already in list, nothing happens)
ExamineField(E)
(already in list, nothing happens)
,榜单最终将C,E,B,d,A
来源
2009-07-28 06:31:47
caf
非常感谢,这正是术语,我之后。 – Coxy 2009-07-28 08:03:30