矩阵中的递归路径查找

时间:2013-01-25 16:48:36

标签: c recursion matrix tail-recursion

我需要在1中找到matrix[R][C]中的数字matrix[0][0]的路径,从matrix[R-1][C-1]开始,直至到达1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 ,使用递归。我只能向下或向右走。 在大多数情况下,我没有问题。我的问题是,只有在无处可去的时候,我需要向后退一步。

每个例子,这是我从文件中得到的矩阵:

matrix[4][0]

问题在于它到达int findPath(int matrix[][C],int rowSize,int colSize) { int a=0,b=0; if(Find_Path(matrix,rowSize,colSize,a,b)==0) { printf("The function return - False\n"); return 0; } else { printf("The function return - True\n"); return 1; } } int Find_Path(int matrix[][C],int rowSize,int colSize,int a,int b) { if(a==(rowSize-1) && (b==colSize-1)) return 1; if(matrix[a+1][b]==1) return Find_Path(matrix,rowSize-1,colSize-1,a+1,b); if(matrix[a][b+1]==1) return Find_Path(matrix,rowSize-1,colSize-1,a,b+1); if(matrix[a+1][b]==0 && matrix[a][b+1]==0) return 0; } 。我不明白为什么它不会在递归中返回。它返回true时返回false。

这是代码:

{{1}}

3 个答案:

答案 0 :(得分:3)

  • 你的递归函数是错误的,因为它只是先尝试​​1' 1' 它看到的邻居小区。
  • 递归错误地仅查看矩阵的较小部分。您要么调整矩阵大小(但后来也要调整其原点)或坐标。不是两个。
  • 失败条件(最后一个如果)是错误的并且是假的。
    int Find_Path(int matrix[][C],int rowSize,int colSize,int a,int b)
    {
       if(a==(rowSize-1) && (b==colSize-1))
          return 1;
       if(matrix[a+1][b]==1  &&  Find_Path(matrix,rowSize,colSize,a+1,b))
          return 1;
       if(matrix[a][b+1]==1  &&  Find_Path(matrix,rowSize,colSize,a,b+1))
          return 1;
       return 0;
    }

(虽然我没有测试过。)

答案 1 :(得分:1)

你需要检查一下你是不是从矩阵上掉下来了,我发现它稍微更整洁一点,而不是在移动之前检查矩阵中的1和0。把它们放在一起就可以得到这个代码。

int find_path(int matrix[R][C], int i, int j) {
    if (!matrix[i][j]) return 0;
    if (i == R-1 && j == C-1) return 1;
    return i+1<R && find_path(matrix, i+1, j) ||
           j+1<C && find_path(matrix, i, j+1));
}

答案 2 :(得分:0)

[3][0]if(matrix[a+1][b]==1)将成功,它将尝试调用return Find_Path(matrix,rowSize-1,colSize-1,4,0);现在返回值为0,然后您将直接返回。仅当递归调用返回1时,才从该位置返回1

if(matrix[a+1][b]==1)
    if(Find_Path(matrix,rowSize-1,colSize-1,a+1,b)) return 1;
if(matrix[a][b+1]==1)
    if(Find_Path(matrix,rowSize-1,colSize-1,a,b+1)) return 1;

因为[4][0]正在回复0的代码调用,并且您将使用0从该地点返回。您不打算进行下一次检查if(matrix[a][b+1]==1)