【问题标题】:How to maintain values in recursive calls?如何在递归调用中维护值?
【发布时间】:2014-12-20 21:40:06
【问题描述】:

让我们假设[假设,我们有一个如下所示的双向图

现在,来自源 8 的 DFS 遍历将是 8 1 2 3 6 7 4 5。 递归实现

vector <int>  v[10001];
bool visited[10001];
void DFS(int s)
{
 visited[s]=true;
 cout<<s<<" ";
 for(int i=0;i<v[s].size();i++)
 {

 if(!visited[v[s][i]])
 {
     DFS(v[s][i]);
 }
 }
}

所以首先它会递归地按照 8->1->2->3 , 8->6 , 8->7->4->5

现在,使用此功能,我还想跟踪每个节点与其源的距离。 让我们将其称为 dist[N],其中 N=节点数。 在这张图中 距离[8]=0, dist1=1, 距离[2]=2 等等。我该如何实施?

起初我尝试保留一个变量 d 并将其递增,如下面的代码所示

int d=0;
void DFS(int s)
{
 visited[s]=true;
 cout<<s<<" ";
 dist[s]=d;
 d++;
 for(int i=0;i<v[s].size();i++)
 {
 if(!visited[v[s][i]])
 {
     DFS(v[s][i]);
 }
 }
}

但是很明显,d 的值在再次达到 8 时必须重置为 0,否则根据上述函数 dist[6] 将是 1+ dist[3]。如何克服这一点?另外,有没有更有效的方法来实现这一点?

【问题讨论】:

  • 如果v[x][y]表示x和y之间有边,visited[v[x][y]]是什么意思?!
  • 对不起那个陈述。如果从 x 到 y 有一个 exge,我们在 v[x] 中插入 y。在任何情况下,v[x][i] 都将是一个与 x 相邻的“节点”。
  • 详细说明,v[8][0] 将是 "node" 1 , v[8][1] 将是节点 6, v[8][2] 将是节点 7

标签: recursion graph microsoft-distributed-file-system


【解决方案1】:

它可以作为下一次迭代的参数,而不是全局变量跟踪深度。

void DFS(int s, int d)
{
 visited[s]=true;
 cout<<s<<" ";
 dist[s]=d;
 for(int i=0;i<v[s].size();i++)
 {
     if(!visited[v[s][i]])
    {
       DFS(v[s][i], d+1);
    }
 }
}

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2023-04-04
    • 2021-04-28
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多