递归函数中的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()); } } 返回路径; }

递归函数中的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的实

我知道生成的路径只会按照DFS访问节点的顺序列出节点,而不是从开始到目标节点的实际路径


问题在于,即使在找到目标节点后,该函数仍会继续打印节点。为了避免这种情况,我使用
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?