我有一个连通的、有向的、循环的图。任务是发现图中的每个节点,而不会陷入无限循环,因为普通的树遍历算法会这样做。
你可以假设我已经知道要从哪个节点开始才能到达有向图中的所有点,并且对于每个节点,我都有一个返回它所指向的节点的函数。是否有已知的算法可以找到所有节点?
主要问题实际上是避免循环,如果有一种方法可以在不跟踪每个节点并将其与已经遍历过的节点列表进行比较的情况下完成,那就太好了。
如果需要更多细节,实际任务是获取JavaScript中每个命名函数的列表,包括其他对象的属性函数。因此,我尝试了以下内容,因为我认为JS对象之间的引用构成了一棵树(但当然不是):
这段代码的问题在于它会陷入循环中。
你可以假设我已经知道要从哪个节点开始才能到达有向图中的所有点,并且对于每个节点,我都有一个返回它所指向的节点的函数。是否有已知的算法可以找到所有节点?
主要问题实际上是避免循环,如果有一种方法可以在不跟踪每个节点并将其与已经遍历过的节点列表进行比较的情况下完成,那就太好了。
如果需要更多细节,实际任务是获取JavaScript中每个命名函数的列表,包括其他对象的属性函数。因此,我尝试了以下内容,因为我认为JS对象之间的引用构成了一棵树(但当然不是):
function __findFunctions(obj){
for (var f in obj){
// for special case of edge with self
if (obj === obj[f]){
continue
}
if (typeof obj[f] === 'function' &&
obj.hasOwnProperty(f) &&
// exclude native functions, we only want user-defined ones
!(/\[(native\scode|object\sfunction)\]/i).test(obj[f].toString()) &&
// exclude functions with __ prefix
!(/^\s*function\s*__/).test(obj[f].toString())
){
document.write(f + "<br/>" + obj[f].toString() + "<hr/>");
}
//alert(typeof obj[f] + "\n" + obj + "\n" + obj[f] + "\n" + f)
__findFunctions(obj[f]);
}
}
__findFunctions(window);
这段代码的问题在于它会陷入循环中。