2015-02-12 2 views
0
private static BigInteger[] matrixPow(BigInteger[] matrix, int n){ 
    if(n==0){ 
     BigInteger[] result = {BigInteger.ONE, BigInteger.ZERO, BigInteger.ZERO, BigInteger.ONE}; 
    } 
    else{ 
     BigInteger[] partial = matrixPow(matrix, n/2); 
     BigInteger[] result = matrixMultiply(partial, partial); 
     if(n%2 == 1){ 
      result = matrixMultiply(result,matrix); 
     } 
      return result; 
    } 

} 

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

+3

Ваш метод не возвращает ничего, если 'n' 0. – immibis

+0

Я понимаю, что это выглядит ужасно смотреть на так ЭРВ образом его http://puu.sh/fPOhL/89561438e5.png – Thorx99

+0

, если п == 0 возвращает идентификационную матрицу – Thorx99

ответ

1

возвращения инкапсулируется в блок else.

У вас нет возврата в if части блока if else, поэтому, если он достиг блока if, он ничего не вернет, следовательно, будет ошибка.

+0

oh gosh Спасибо, только что заметили, что – Thorx99

+0

@ Thorx99 Кроме того, вам нужно объявить переменную 'result' перед if-statement, иначе правила определения области видимости сделают ее невидимой вне. –

4

Вы должны переместить return result на один объем.

private static BigInteger[] matrixPow(BigInteger[] matrix, int n){ 
    BigInteger[] result; 
    if(n==0) { 
     result = {BigInteger.ONE, BigInteger.ZERO, BigInteger.ZERO, BigInteger.ONE}; 
    } else { 
     BigInteger[] partial = matrixPow(matrix, n/2); 
     result = matrixMultiply(partial, partial); 
     if(n%2 == 1) { 
      result = matrixMultiply(result,matrix); 
     } 
    } 
    return result; 
} 

Основная проблема здесь состоит в том, что ваше форматирование, т.е. отступы выключен, что делает его трудно увидеть, где прицелы начинаются и заканчиваются.

Смежные вопросы