2014-11-02 57 views
0

爲什麼這隻能工作到n = 90左右? 試圖計算第94個斐波納契數給出了不正確的結果。 如果我使用Integer類而不是Long,則會發生同樣的情況。斐波那契線性時間遞推

import java.util.HashMap; 

public class FDP { 

    private static HashMap<Long, Long> fib = new HashMap<Long, Long>(); 

    private static Long calculateFib(Long n) { 

     if(fib.get(n)==null){ 
      Long temp = calculateFib(n-1) + calculateFib(n-2); 
      fib.put(n, temp); 
      return temp; 
     } 
     else{ 
      return fib.get(n); 
     } 
    } 
    } 

    public static void main(String[] args) { 
     fib.put(0L, 0L); 
     fib.put(1L, 1L); 
     System.out.println(calculateFib(90L)); //success 
     System.out.println(calculateFib(94L)); //garbage?? 
    } 
} 

這裏是斐波那契數的列表:

http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html

回答

1

其溢出。 第94 Fibonacci數是:19740274219868223167 Long.MAX_VALUE是: 9223372036854775807

19740274219868223167 - 9223372036854775807 > 0

您可以使用BigInteger任意長度來處理數字。

1

到達類型(64位)的侷限性,使用BigInteger的代替