当递归函数到达c中的较高深度时,停止递归函数

时间:2018-12-25 21:34:36

标签: c recursion

我想在到达3000深度时停止递归函数。我该怎么办?

 void DFS(bool M[][COL], int row, int col) 
    { 
        short k;

        M[row][col] = 0; 

        for (k = 0; k < 4; k++){
            if(k==0){
                if (isSafe(M, row , col - 1) ){
                    DFS(M, row , col - 1);
                }
            }
            if(k==1){
                if (isSafe(M, row , col + 1) ){         

                   DFS(M, row , col + 1);
                }
            }
            if(k==2){
                if (isSafe(M, row + 1, col) ){          
                    DFS(M, row + 1, col);
                }
            }
            if(k==3){
                if (isSafe(M, row - 1 , col) ){         
                    DFS(M, row - 1, col);
                }
            }
        }

    }

当我添加计数器时,我试图在3000时返回它,但是我不能说我非常成功。

我有512 * 512矩阵,正在该矩阵中寻找孤岛。如果某个岛的面积超过10000个单位,则递归函数会给出错误。

3 个答案:

答案 0 :(得分:7)

  

我想在到达3000深度时停止递归函数

对此的一般解决方案是在函数中添加“ depth”参数,并将void DFS(bool M[][COL], int row, int col) { static int depth = 0; ++depth; if (depth > 3000) { --depth; return; } M[row][col] = 0; if (isSafe(M, row , col - 1) ) DFS(M, row , col - 1); if (isSafe(M, row , col + 1) ) DFS(M, row , col + 1); if (isSafe(M, row + 1, col) ) DFS(M, row + 1, col); if (isSafe(M, row - 1 , col) ) DFS(M, row - 1, col); --depth; return; } 传递给每个递归调用(如果要倒数,则传递depth + 1)。要将其隐藏在面向外部的API中,请使公共函数(不使用depth参数),只需使用remaining_depth - 1的初始值调用实际函数即可。

例如:

depth

答案 1 :(得分:3)

首先,如果您花时间为邻居编写四个不同的if,for是毫无意义的。他们每个都会执行一次。

txtEmpNumber

这应该有效。 depth变量将计算对DFS的调用次数,每次返回时,您将减小该值。 但这不是最好的方法,因为在某些情况下它可能会引起问题。我唯一想到的就是使用异常时。因为它们将退出您的函数,而不会减小depth变量。

另一种方法是将深度作为参数,但这会使函数调用起来很冗长。

答案 2 :(得分:1)

为什么一开始没有!isSafe()呼叫?如果在if语句中调用isSafe(),将获得相同的结果。通过在开始时移动isSafe (),可以避免重复代码,从而提高代码的可读性,并且不容易出错。这样,它将只执行return语句。

现在是您要深度的部分。

void DFS(bool M[][COL], int row, int col)  {
    static int depth = 0;

    if ( !isSafe(M, row , col) || depth > 3000)
        return;

    depth++;

    short k;

    M[row][col] = 0; 

    for (k = 0; k < 4; k++)
        switch (k)
            case 0 :
                DFS(M, row , col - 1);
                break;
            case 1 :
               DFS(M, row , col + 1);
               break;
            case 2 :
                DFS(M, row + 1, col);
                break;
            case 3 :
                DFS(M, row - 1, col);
                break;
            default :
                return;
}

现在,我认为我确实同意@Tudors关于for循环的观点,但是我将在此保留它,以便使用更好的语法重写代码。