我在C++中的图上实现深度优先搜索。给定一个起始顶点,该算法应该执行DFS,直到找到一个目标节点(即一个goal
设置为true的节点),并返回所采用的路径。我试图递归地做到这一点,这是我的代码:For循环递归函数在递归结束后继续
vector<char>* dfs(graph g, node* s){
static vector<char> path;
s->set_visited();
path.push_back(s->get_tag()); //Adds node to path
if(s->is_goal()){
g.set_all_visited();
}
else{
for(int i=0; i<(s->get_no_edges()); i++){
if(!(s->get_edge(i)->get_dest()->is_visited())) //If it is unvisited, apply recursion
dfs(g, s->get_edge(i)->get_dest());
}
}
return &path;
}
据我所知,所产生的路径将只列出他们由DFS访问的顺序节点,从不是一个实际的路径开始到目标节点。
问题在于,即使在找到目标节点之后,函数仍继续打印节点。为了避免这种情况,我将图g
中的所有节点设置为使用set_all_visited()
访问,并在继续前检查了else
部分中是否访问了节点,但这似乎不起作用。当我执行干运行时,即使在找到目标节点之后,该功能仍然访问for
循环中节点的所有边缘,并且我不知道如何阻止该情况发生。
也许它与按值传递'g'有关。尝试通过引用传递它。将所有节点标记为已访问的'g'与其他递归调用可用的'g'不同。 – IVlad
https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ 特别是在这种情况下,你似乎确信它停留在for循环 - 因此'我<(s-> get_no_edges( ))是真的。所以,在调试器(或者使用'穷人'调试器'cout')看看'i'和's-> get_no_edges()',然后看看为什么这个条件仍然是真的。 – slim
@IVlad我试了一下,它似乎现在工作!这样愚蠢的错误。谢谢! –