0

下面的代码片段的目的是创建一个矩阵的实例,然后计算一个 nxn 矩阵的行列式。但是,方法computeDet不会返回,因为发生以下错误:value cannot be resolved to a variable. 这是为什么?
** 从这里编辑的行列式代码(此代码确实有效 - 没有错误)

public class MatrixArrayCR {
long[][] matrix;

public MatrixArrayCR(long[] arr) {
    double len = Math.sqrt(arr.length);
    int counter = 0;
    for (int i=0; i==len; i++) {
        for (int j=0; j==len; j++) {
            matrix[i][j] = arr[counter];
            counter++;
        }
    }
}
// determinant method edited from code off http://www.coderanch.com/t/446179/java/java/Learning-Project
    public long determinant() {
        return computeDet(matrix);
    }
    public long computeDet(long[][] matrix) {
        int matrixSize = matrix.length;
        if (matrixSize==2) {
            return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
        } else {
            long value = 0;
            for (int i=0; i<matrixSize; i++) {
                long[][] minor=generateMinor(matrix,0,i);
                value += (sgn(i)*matrix[0][i]*computeDet(minor));
            }
        } return value; //ERROR HERE
    }
    private int sgn(int n) {
        if (n%2==0) {
            return 1;
        } else {
            return -1;
        }
    }
    private long[][] generateMinor(long[][] matrix, int row, int column) {
        int matrixSize = matrix.length;
        int minorSize = matrixSize -1;
        int counterOne = 0;
        int counterTwo = 0;
        long[][] minor = new long[minorSize][minorSize];

        for (int i=0; i<matrixSize; i++) {
            if (i==row) {
                continue;
            } for (int j=0; j<matrixSize; j++) {
                if (j==column) {
                    continue;
                } minor[counterOne][counterTwo] = matrix[i][j];
                ++ counterTwo;
            } ++counterOne;
            counterTwo = 0;
        } return minor;
    }
}
4

2 回答 2

2

value是一个局部变量,即它只在它被声明的块中可见。由于您在 else 块中声明了 value 并尝试在此块之外返回它,因此您会收到此错误。

return 语句应该在 else 块中。IE :

public long computeDet(long[][] matrix) {
        int matrixSize = matrix.length;
        if (matrixSize==2) {
            return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
        } else {
            long value = 0;
            for (int i=0; i<matrixSize; i++) {
                long[][] minor=generateMinor(matrix,0,i);
                value += (sgn(i)*matrix[0][i]*computeDet(minor));
            }
            return value; 
        }
    }
于 2013-11-16T21:23:10.287 回答
1

value 变量在 if 或 else 块内声明,并且仅在声明它的块内可见。如果您希望它在方法的末尾可见,请在方法的开头声明它,在 if/else 块之前。

public long computeDet(long[][] matrix) {
    long value = 0L;
    int matrixSize = matrix.length;
    if (matrixSize==2) {
        value = matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    } else {
        for (int i=0; i<matrixSize; i++) {
            long[][] minor=generateMinor(matrix,0,i);
            value += (sgn(i)*matrix[0][i]*computeDet(minor));
        }
    } 
    return value; 
}

要么从else 块内部返回它:

public long computeDet(long[][] matrix) {
    int matrixSize = matrix.length;
    if (matrixSize==2) {
        return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];
    } else {
        long value = 0;
        for (int i=0; i<matrixSize; i++) {
            long[][] minor=generateMinor(matrix,0,i);
            value += (sgn(i)*matrix[0][i]*computeDet(minor));
        }
        return value; //ERROR HERE
     }  // this guy moved
}
于 2013-11-16T21:23:04.183 回答