我想在到达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个单位,则递归函数会给出错误。
答案 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
循环的观点,但是我将在此保留它,以便使用更好的语法重写代码。