Java 查找具有最高和的矩阵行
我正在尝试编写一个递归的非静态方法,对于每个给定的矩阵,该方法将返回具有最高总和的行号。我不允许使用静态方法和for循环(在我编写的任何方法中) 我认为解决方法有三种:Java 查找具有最高和的矩阵行,java,recursion,Java,Recursion,我正在尝试编写一个递归的非静态方法,对于每个给定的矩阵,该方法将返回具有最高总和的行号。我不允许使用静态方法和for循环(在我编写的任何方法中) 我认为解决方法有三种: (私有)计算给定行的总和 (专用)使用方法#1将行i的总和与i+1的总和进行比较 (公共)检查矩阵是否有多行,并对行0应用#2 我觉得我解决这个问题的方法把事情复杂化了。如果有人愿意给我推荐更好的算法,我很乐意尝试 不管怎样,我相信我对1和3没意见。我的问题是#2。我不知道如何设置行号变量: public class Matri
i
的总和与i+1
的总和进行比较0
应用#2public class Matrix {
private int[][] _mat;
public Matrix(int sizeRow, int sizeCol) {
_mat = new int[sizeRow][sizeCol];
}
private int maxRow(int row) { //Recursive method #2: comparing sum of i and i+1
int rowNumber;
if (row <= _mat.length) {
if (rowSum(row, 0) > rowSum(row+1,0)) {
rowNumber = row;
return maxRow(row+1);
}
else {
return rowNumber;
}
}
else {
return rowNumber;
}
}
..
public int maxRow() {..} //Recursive method #3
private int rowSum(int i, int j) {..} //Recursive method #1
}
公共类矩阵{
私有int[][]\u mat;
公共矩阵(int sizeRow、int sizeCol){
_mat=新整数[sizeRow][sizeCol];
}
私有int-maxRow(int-row){//递归方法#2:比较i和i+1之和
整数行数;
if(第行行和(第+1,0行)){
行数=行数;
返回maxRow(行+1);
}
否则{
返回行数;
}
}
否则{
返回行数;
}
}
..
public int maxRow(){..}//递归方法#3
私有int行和(inti,intj){..}//递归方法#1
}
我的问题是var行数
。它还没有初始化,如果我要初始化它,每次我调用该方法时,它都会被设置为0
我发现了完全相同的问题,但建议的方法是静态的并接收数组。如果需要返回具有最大和的行索引,可以执行以下操作:
private int maxRow(int current_index, int max_index) {
if (current_index == _mat.length) {
return max_index;
} else if (sumRow(current_index) > sumRow(max_index)) {
return maxRow(current_index+1, current_index);
} else {
return maxRow(current_index+1, max_index);
}
}
maxRow(1, 0); //method call
第一个参数current_index
存储您当前正在测试的索引,而参数max_index
存储到目前为止具有最大和的访问索引
第一个子句确保在到达数组末尾时返回具有最大和值的任何索引
当您发现一行的总和高于之前的总和时,第二个子句将更新max_index
当上述情况没有发生时,第三个子句只会迭代到下一行
您可以使用current_index=1
和max_index=0
调用该方法,因此不需要使用无效值初始化max_index
如果要提高性能,还可以添加一个新参数
max\u value
来存储当前的最大和,这样就不需要在每次递归调用时调用它。这是一个如何检索具有最高和的行的索引的示例
公共类MaxRowFromArray{
私有最终int[][]值;
公共MaxRowFromArray(int[][]值){
这个值=值;
}
私有int-sumOfRow(int[]行,int-rowIndex,int-sum){
如果(行索引>行长度-1){
回报金额;
}
返回sumOfRow(行,行索引+1,和+行[rowIndex]);
}
私有int highestRow(int列、int highestIndex、int highestRow){
如果(列>值.length-1){
返回最高指数;
}
int-sumOfRow=sumOfRow(值[列],0,0);
如果(sumOfRow>highestRow){
返回highestRow(列+1,列,sumOfRow);
}
返回highestRow(列+1,highestIndex,highestRow);
}
公共int highestRow(){
int-highest=highestRow(0,0,-1);
如果(最高==-1){
抛出新的IllegalStateException(“找不到总和最高的行”);
}
回报最高;
}
}
试验
publicstaticvoidmain(字符串[]args){
MaxRowFromArray max=新的MaxRowFromArray(新的int[][]{
{ 1 },
{ 1, 2 },
{ 1, 2, 3 },
{ 1, 2, 3, 4}
});
int-expectedHighest=3;
int highestIndex=最大highestRow();
如果(最高指数!=预期最高){
抛出新的断言错误(String.format)(“最高索引%s不是预期的最高%s.”,
最高指数,预期最高);
}
System.out.println(“最高:“+最高指数”);
}
所以只需将rowNumber
作为参数传递给maxRow
?“它是什么数据类型?”杰森编辑了这个问题<代码>\u mat是一个双数组。