Java 查找具有最高和的矩阵行

Java 查找具有最高和的矩阵行,java,recursion,Java,Recursion,我正在尝试编写一个递归的非静态方法,对于每个给定的矩阵,该方法将返回具有最高总和的行号。我不允许使用静态方法和for循环(在我编写的任何方法中) 我认为解决方法有三种: (私有)计算给定行的总和 (专用)使用方法#1将行i的总和与i+1的总和进行比较 (公共)检查矩阵是否有多行,并对行0应用#2 我觉得我解决这个问题的方法把事情复杂化了。如果有人愿意给我推荐更好的算法,我很乐意尝试 不管怎样,我相信我对1和3没意见。我的问题是#2。我不知道如何设置行号变量: public class Matri

我正在尝试编写一个递归的非静态方法,对于每个给定的矩阵,该方法将返回具有最高总和的行号。我不允许使用静态方法和for循环(在我编写的任何方法中)

我认为解决方法有三种:

  • (私有)计算给定行的总和

  • (专用)使用方法#1将行
    i
    的总和与
    i+1
    的总和进行比较

  • (公共)检查矩阵是否有多行,并对行
    0
    应用#2

  • 我觉得我解决这个问题的方法把事情复杂化了。如果有人愿意给我推荐更好的算法,我很乐意尝试

    不管怎样,我相信我对1和3没意见。我的问题是#2。我不知道如何设置行号变量:

    public 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是一个双数组。