如何在二维数组内查找峰值时停止Java递归

时间:2018-01-16 11:26:24

标签: java recursion 2d

所以我一直试图在很长一段时间内完善这种方法,但我不能让它发挥作用。我想要做的是在仅使用Java的递归中找到不同整数的2D数组中的峰值数。

基本上我的方法是检查索引是否在数组内部,以及上方,下方,左侧和右侧的数字是更大比当前数字更大

如果是,则递归打印当前点并继续。但是,根据我编写的代码,该方法找到第一条路径,然后由于某种原因,返回并找到不同的路径,这会产生问题,我只想要一条路径打印然后方法需要停止。

我已经尝试使用布尔值来检查是否存在峰值然后返回true但它仍会返回并打印其他路径。如果你们能帮助我,那就太棒了。

这是代码:

private static void printPath (int[][] mat, int i, int j) {

    System.out.println("("+i+","+j+")");

    if (i >=0 && i < mat.length-1 && mat[i][j] < mat[i+1][j]){
        printPath(mat,i+1,j);
    }
    if (j >=0 && j < mat[0].length-1 && mat[i][j] < mat[i][j+1]){
        printPath(mat,i,j+1);
    }
    if (i>0 && i < mat.length-1 && mat[i][j] < mat[i-1][j]){
        printPath(mat,i-1,j);
    }
    if (j>0 && j < mat[0].length-1 && mat[i][j] < mat[i][j-1]){
        printPath(mat,i,j-1);
    }


}    

4 个答案:

答案 0 :(得分:2)

为什么不改变整个算法?

  1. 通过逐个附加m*nm项目数组,将矩阵展平为n大小的1D数组。

  2. 使用简单max算法查找展平数组中峰值的索引。

  3. 将展平数组中的索引转换为原始矩阵中的点:

    i = index / m
    j = index % m
    
  4. 修改

    尝试在else s:

    之间添加if个关键字
    private static void printPath (int[][] mat, int i, int j) {
    
        System.out.println("("+i+","+j+")");
    
        if (i >=0 && i < mat.length-1 && mat[i][j] < mat[i+1][j]){
            printPath(mat,i+1,j);
        } else if (j >=0 && j < mat[0].length-1 && mat[i][j] < mat[i][j+1]){
            printPath(mat,i,j+1);
        } else if (i>0 && i < mat.length-1 && mat[i][j] < mat[i-1][j]){
            printPath(mat,i-1,j);
        } else if (j>0 && j < mat[0].length-1 && mat[i][j] < mat[i][j-1]){
            printPath(mat,i,j-1);
        }
    }   
    

    但是我仍然不确定算法 - 这将能够找到一个局部峰值,但不能全局 - 想象有一个物品的所有邻居都低于它自己,但是矩阵中的其他地方可能有更大的数字。你的算法会停在这个项目上,即使它不是最大的那个。

答案 1 :(得分:1)

它“返回”的原因是每次递归调用时可能有4个分支。让我们考虑一个例子:

  1. 第一个条件为真,所以第一条路径开始
  2. 在某些时候,没有条件满足并且路径结束
  3. 程序返回最后一帧Index.to_frame)并执行结束时的代码&lt; - 这会导致您的问题
  4. 因此,当第一次执行完成时,它开始回到起点,可能再次分支。要解决这个问题,你必须将你的条件加入一个语句,这样才能从你的函数中触发一个递归调用。

    如果您现在需要在您的函数中使用分支(我没有从描述中得到它),您将不得不传递额外的mat-option 方法参数,指示是否进一步需要搜索。你必须在你的方法中以某种方式检查endConditon并相应地传递值。当然可以将此添加到您的方法中:

    
    transform() { ... return value.filter(v => v.value === argtext); }
    

答案 2 :(得分:1)

如果您正在寻找任何一条可能的路径而不是具有最大值的路径,我有一个简单的解决方案。

将剩余的 if 语句设为 else if if 语句。您强制程序仅在递归函数的每次调用中遵循一个路径

答案 3 :(得分:1)

嗯......在这种情况下,我不建议您只使用 else 语句,因为这样您只会显示找到的第一个高路径。我重新编写了代码以找到最高的矩阵路径。显然,它变得更加复杂,但你可以确保找到最高的路径。

private static void printPath (int[][] mat, int i, int j) {

    if (mat.length == 0 || mat[0].length == 0) {
        System.out.println("Empty matrix");
        return;
    }

    System.out.println("("+i+","+j+")");

    int rightValue = i >=0 && i < mat.length-1 && mat[i][j] < mat[i+1][j] ? mat[i+1][j] : mat[i][j];
    int belowValue = j >=0 && j < mat[0].length-1 && mat[i][j] < mat[i][j+1] ? mat[i][j+1] : mat[i][j];
    int aboveValue = i>0 && i < mat.length-1 && mat[i][j] < mat[i-1][j] ? mat[i-1][j] : mat[i][j];
    int leftValue = j>0 && j < mat[0].length-1 && mat[i][j] < mat[i][j-1] ? mat[i][j-1] : mat[i][j];

    // now you need to iterate over the four values to check wich one is the highest value
    // this way, you will get the highest path... 

    if (rightValue > leftValue) {
        if (rightValue > belowValue) {
            if (rightValue > aboveValue) {
                printPath(mat,i+1,j);
            } else {
                printPath(mat,i,j+1);
            }
        } else {
            if (belowValue > aboveValue) {
                printPath(mat,i-1,j);
            } else {
                printPath(mat,i,j+1);
            }
        }
    } else {
        if (leftValue > belowValue) {
            if (leftValue > aboveValue) {
                printPath(mat,i-1,j);
            } else {
                printPath(mat,i,j+1);
            }
        } else {
            if (belowValue > aboveValue) {
                printPath(mat,i-1,j);
            } else {
                printPath(mat,i,j+1);
            }
        }
    }
}

如果您需要找到包含最高值的路径,这将为您提供正确的输出。希望它有所帮助。