java - 如何在二维数组中查找峰值中停止Java递归

标签 java recursion 2d

所以我花了很长时间试图完善这个方法,但我无法让它发挥作用。我想做的是仅在 Java 中使用递归在不同整数的二维数组中找到峰值数。

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

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

我尝试输入一个 boolean 值来检查是否存在峰值,然后返回 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);
    }


}    

最佳答案

为什么不改变整个算法?

  1. 通过依次附加包含 n 项的 m 数组,将矩阵展平为 m*n 大小的一维数组。

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

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

    i = index / m
    j = index % m
    

编辑

尝试在这些 if 之间放置 else 关键字:

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);
    }
}   

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

关于java - 如何在二维数组中查找峰值中停止Java递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280166/

相关文章:

java - 如何通过循环将字符串添加到字符串数组列表

java - 找到从左上角到右下角的所有路径问题。以数组为参数的递归解法输出说明

algorithm - 如何确定 2D 中的可见性

jquery - 使用ajax将 "submit"处理程序递归附加到表单?

java - OpenGL LWJGL 纹理渲染失败

R从原始数据生成二维直方图

java - 我应该使用什么样的数据结构来捕获角色扮演游戏中的角色属性

java - 在单个项目中使用 SBT 和 Maven?

java - 将 @Version 与 Envers 一起使用

java - 使用三种预先给定的方法反向打印字符串?