Algorithm 是否有退出DFS过程的好方法?

Algorithm 是否有退出DFS过程的好方法?,algorithm,recursion,depth-first-search,Algorithm,Recursion,Depth First Search,我了解到递归深度优先搜索过程按深度搜索整个树,跟踪所有可能的选择 但是,我想修改函数,这样我就可以在中间调用一个“完全退出”,这将完全停止递归。有没有一种有效的方法可以做到这一点?有三种方法可以做到这一点 返回一个表示您已完成的值,并在每次调用后检查该值 抛出异常并在顶层捕获它 从递归切换到堆栈,然后中断循环 第三种方法效率最高,但工作量最大。第一个是最清楚的。第二种方法简单有效,但往往会使代码更加复杂,在许多语言中效率低下。有三种方法可以做到这一点 返回一个表示您已完成的值,并在每次调用后检

我了解到递归深度优先搜索过程按深度搜索整个树,跟踪所有可能的选择


但是,我想修改函数,这样我就可以在中间调用一个“完全退出”,这将完全停止递归。有没有一种有效的方法可以做到这一点?

有三种方法可以做到这一点

  • 返回一个表示您已完成的值,并在每次调用后检查该值
  • 抛出异常并在顶层捕获它
  • 从递归切换到堆栈,然后
    中断
    循环

  • 第三种方法效率最高,但工作量最大。第一个是最清楚的。第二种方法简单有效,但往往会使代码更加复杂,在许多语言中效率低下。

    有三种方法可以做到这一点

  • 返回一个表示您已完成的值,并在每次调用后检查该值
  • 抛出异常并在顶层捕获它
  • 从递归切换到堆栈,然后
    中断
    循环

  • 第三种方法效率最高,但工作量最大。第一个是最清楚的。第二种方法简单有效。但往往会使代码更加复杂,在许多语言中效率低下。

    常见的DFS工作原理如下:

    DFS(u){
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    static bool STOP = false;   
    
    DFS(u){
        if(STOP) return;
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    您可以尝试以下方法:

    DFS(u){
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    static bool STOP = false;   
    
    DFS(u){
        if(STOP) return;
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    

    在DFS的开头放置一个静态bool应该可以保证,一旦您将
    STOP
    设置为true,从现在起,DFS的堆栈递归调用将不会执行任何重要操作。不幸的是,它不仅会忽略堆叠的函数调用,而且它们会立即完成。

    常见的DFS的工作原理如下:

    DFS(u){
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    static bool STOP = false;   
    
    DFS(u){
        if(STOP) return;
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    您可以尝试以下方法:

    DFS(u){
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    
    static bool STOP = false;   
    
    DFS(u){
        if(STOP) return;
        mark[u] = true
        for each v connected to u:
            if(!mark[v]) DFS(v)
    }
    

    在DFS的开头放置一个静态bool应该可以保证,一旦您将
    STOP
    设置为true,从现在起,DFS的堆栈递归调用将不会执行任何重要操作。不幸的是,它不仅会忽略堆叠的函数调用,而且它们会立即完成。

    corroutines

    比利的回答是错误的三分法。有三(3)种以上的方法可以做到这一点。非常适合这种情况,因为它们是可暂停、可恢复和可取消的-

    def dfs(t):
    如果不是t:
    
    返回#协同程序

    比利的回答是错误的三分法。有三(3)种以上的方法可以做到这一点。非常适合这种情况,因为它们是可暂停、可恢复和可取消的-

    def dfs(t):
    如果不是t:
    
    return#throw an exception?另外,您可以切换到带有stack的迭代DFS,然后使用纯break语句进行提前终止非常简单。您不清楚中间的
    调用“完全退出”是什么意思。这是否意味着递归函数本身应该在找到感兴趣的内容后取消DFS。或者,用户或超时计时器是否有能力在中间取消DFS?抛出异常?也可以用堆栈切换到迭代的DFS,然后用简单的断言语句提前终止是非常简单的。不清楚您所说的<代码> >在中间< /代码>中调用一个“完全退出”。这是否意味着递归函数本身应该在找到感兴趣的内容后取消DFS。或者,用户或超时定时器有能力在中间取消DFS吗?