2013-11-16 2 views
0

Целью нижеприведенного фрагмента кода является создание экземпляра матрицы, а затем вычисление детерминанта матрицы nxn. Однако метод computeDet не вернется, потому что возникает следующая ошибка: value cannot be resolved to a variable. Почему это?
** определитель кода редактируется here (этот код работает - нет ошибки)Значение не может быть разрешено

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

ответ

1

переменной величины объявляется внутри если либо блок и видна только внутри блока он был объявлен. Если вы хотите, чтобы он был видимым в конце метода, объявите его в начале метода перед блоками 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; 
} 

Либо это, либо вернуть его из внутри блока еще:

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 
} 
2

value является локальной переменной, то есть она видна только в блоке, он был объявлен. Поскольку вы объявили значение в блоке else и попытаетесь вернуть его за пределы этого блока, вы получите эту ошибку.

Оператор return должен находиться в блоке else. I.e:

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; 
     } 
    } 
Смежные вопросы