所以我一直试图在很长一段时间内完善这种方法,但我不能让它发挥作用。我想要做的是在仅使用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);
}
}
答案 0 :(得分:2)
为什么不改变整个算法?
通过逐个附加m*n
个m
项目数组,将矩阵展平为n
大小的1D数组。
使用简单max
算法查找展平数组中峰值的索引。
将展平数组中的索引转换为原始矩阵中的点:
i = index / m
j = index % m
修改强>
尝试在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个分支。让我们考虑一个例子:
Index.to_frame
)并执行结束时的代码&lt; - 这会导致您的问题因此,当第一次执行完成时,它开始回到起点,可能再次分支。要解决这个问题,你必须将你的条件加入一个语句,这样才能从你的函数中触发一个递归调用。
如果您现在需要在您的函数中使用分支(我没有从描述中得到它),您将不得不传递额外的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);
}
}
}
}
如果您需要找到包含最高值的路径,这将为您提供正确的输出。希望它有所帮助。