2017-09-08 10 views
2

긴 데이터 형식을 사용하여 메서드를 작동시키지 만, BigInteger 재귀 메서드를 호출 할 때 println 때 "null"이라고 표시됩니다. 나는 값이 긴 데이터 유형에 대한 너무 큰 과거 N = 94, 갈 때까지BigInteger 및 memoization을 사용하여 재귀 메서드를 호출 할 때 NULL 가져 오기

public static long fib_rec(int n){ 
    long result=1; 
    if(n<=2){ 
     return result; 
    } 
    else{ 
     if(fval[n]!=0){ 
      result=fval[n]; 
     } 
     else{ 
      result = fib_rec(n-1) + fib_rec(n-2); 
      fval[n] = result; 
     } 
     return result; 
    } 
} 

다시 말하지만, 그 방법은 완벽하게 작동합니다 : 다음은 나를 위해 작동 나의 긴 재귀 적 방법이다. 여기 내 BigInteger를 시도, 전체 프로그램 :

public class BigInt { 

    static BigInteger[] fval; 

    public static void main(String[] args) { 

     int index; 

     Scanner input = new Scanner(System.in); 

     index = input.nextInt(); 

     fval = new BigInteger[index + 1]; 


     System.out.println(fib_rec(index)); 
    } 

    public static BigInteger fib_rec(int index){ 

     BigInteger result = BigInteger.ONE; 

     if(index <= 2){ 
      return result; 
     } 

     else{ 
      if(fval[index] != BigInteger.ZERO){ 
       result=fval[index]; 
      } 
      else{ 
       result = fib_rec(index-1).add(fib_rec(index-2)); 

       fval[index] = result; 

      } 
      return result; 
     } 
    } 
    } 

이 null을 반환하고 내가 왜 아무 생각이 ...

답변

2

당신은 그것을 긴 배열처럼 0으로 채워 BigInteger의 배열이 시작 가정되지만, null 값이 동일하지 BigInteger.ZERO을 같이

if(fval[index] != BigInteger.ZERO){ 
    result=fval[index]; 
} 

항상 null을 반환합니다 : 그것은 객체 배열, 그래서이 같이 널 (null)의 전체 대신 시작합니다.

추가하면이 :

for (int i = 0; i < index+1; i++) { 
    fval[i] = BigInteger.ZERO; 
} 

fib_rec에 전화 후 작동하기 전에.