您想要的是深度优先搜索。
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。