递归函数中的For循环在递归结束后继续 我在C++中实现了一个深度优先搜索。给定起始顶点,算法应执行DFS,直到找到目标节点(即goal设置为true的节点),并返回所采用的路径。我尝试递归地执行此操作,以下是我的代码: vector*dfs(图g,节点*s){ 静态矢量路径; s->set_visted(); path.push_back(s->get_tag());//将节点添加到路径 如果(s->is_goal()){ g、 设置所有已访问的内容(); } 否则{ 对于(int i=0;iget_无边());i++){ 如果(!(s->get_edge(i)->get_dest()->is_visted())//如果未访问,则应用递归 dfs(g,s->get_edge(i)->get_dest()); } } 返回路径; }
我知道生成的路径只会按照DFS访问节点的顺序列出节点,而不是从开始到目标节点的实际路径递归函数中的For循环在递归结束后继续 我在C++中实现了一个深度优先搜索。给定起始顶点,算法应执行DFS,直到找到目标节点(即goal设置为true的节点),并返回所采用的路径。我尝试递归地执行此操作,以下是我的代码: vector*dfs(图g,节点*s){ 静态矢量路径; s->set_visted(); path.push_back(s->get_tag());//将节点添加到路径 如果(s->is_goal()){ g、 设置所有已访问的内容(); } 否则{ 对于(int i=0;iget_无边());i++){ 如果(!(s->get_edge(i)->get_dest()->is_visted())//如果未访问,则应用递归 dfs(g,s->get_edge(i)->get_dest()); } } 返回路径; },c++,algorithm,recursion,graph,C++,Algorithm,Recursion,Graph,我知道生成的路径只会按照DFS访问节点的顺序列出节点,而不是从开始到目标节点的实际路径 问题在于,即使在找到目标节点后,该函数仍会继续打印节点。为了避免这种情况,我使用set_all_visted()将图形g中的所有节点设置为已访问,并在else部分中检查是否在继续之前访问了节点,但这似乎不起作用。当我执行干运行时,即使在找到目标节点后,函数仍会继续访问for循环中节点的所有边,我不知道如何阻止这种情况发生。您正在通过值而不是通过引用传递g。这意味着,每当您找到目标节点并从递归调用返回时,g的实
问题在于,即使在找到目标节点后,该函数仍会继续打印节点。为了避免这种情况,我使用
set_all_visted()
将图形g
中的所有节点设置为已访问,并在else
部分中检查是否在继续之前访问了节点,但这似乎不起作用。当我执行干运行时,即使在找到目标节点后,函数仍会继续访问for
循环中节点的所有边,我不知道如何阻止这种情况发生。您正在通过值而不是通过引用传递g
。这意味着,每当您找到目标节点并从递归调用返回时,g
的实例仍将其节点设置为未访问。这就是重复出现的原因。我知道你的主要问题得到了回答,但我还是会给出一些建议:
1) 不要使用静态向量,不能重用该函数。您可以改为在期望路径的位置创建一个向量,并将指针传递给该向量
2) 为了确保路径中没有所有已访问的节点,可以从dfs函数返回bool,以指示是否存在到目标的路径。也可以避免以这种方式传递图形对象
通过这些更改,您的代码将变成:
bool dfs(node* s, vector<char>* path){
s->set_visited();
if(s->is_goal()){
path.push_back(s->get_tag());
return true;
}
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
if(dfs(s->get_edge(i)->get_dest(), path)) {
path.push_back(s->get_tag());
return true;
}
}
}
return false;
}
booldfs(节点*s,向量*path){
s->set_visted();
如果(s->is_goal()){
path.push_back(s->get_tag());
返回true;
}
否则{
对于(int i=0;iget_无边());i++){
如果(!(s->get_edge(i)->get_dest()->is_visted())//如果未访问,则应用递归
if(dfs(s->get_edge(i)->get_dest(),path)){
path.push_back(s->get_tag());
返回true;
}
}
}
返回false;
}
这将返回反向路径,即从目标到源的路径,有std::reverse
如果你做BFS,你会得到最短路径,而不是一些随机路径,假设边的权重相等。也许这与按值传递
g
有关。试着通过引用传递它。将所有节点标记为已访问的g
与其他递归调用可用的g
不同。特别是在本例中,您似乎确信它处于for循环中——因此iget\u no\u edges())
是真的。因此,在调试器中查看i
和s->get_no_edges()
(或者使用cout
,可怜的人的调试器),亲自看看为什么条件仍然是真的。@IVlad我试过了,它现在似乎起作用了!这样愚蠢的错误。谢谢我不知道您的graph
的实现,但您确定要通过值传递它,而不是通过引用dfs
?也许每次调用图表时都会创建一个副本?但是一般来说,对于DFS实现来说,代码中有很多问题。@AlexanderStante?