2017-06-18 42 views
0

這個代碼在n = 46後沒有返回正確的答案。我能做些什麼來解決這個問題以獲得更高的第n項?斐波納契迭代:找到n> 50的斐波那契數列的第n項

public static long fibonacciIterative(long n) 
    { 
     if(n <= 1) { 
    return n; 
      } 
     int x = 1; 
     int y = 1; 
     for(int i=2; i<n; i++) 
      { 
      int z = x; 
      x+= y; 
      y = z; 
      } 
     return x; 
} 

謝謝大家的好評。我在問完問題後立即找到了代碼,我就明白了。

+1

開始通過改變'x','y'和'z'爲'long' 。 – Eran

+1

提示:您認爲「int」可以表示的最大數目是多少?斐波納契數字超過46是多大? – lurker

+0

'int'將** - 2^31 **中的數字保存到** 2^31-1 **中,因爲'int'由Java中的32位表示。任何斐波那契數n> 46的術語超出這些限制。你可以使用64位的「long」,並保存更大的數字。如果您需要超過「長」的限制,BigInteger會更大。 – Carlton

回答

3

這很可能是因爲整數溢出。對於變量x,yz使用long

這會帶給你更多一點,但最終也會溢出long範圍。如果您還需要更大的號碼,請撥打BigInteger

-1

最優化的方式,用的O(1)複雜性會比奈的公式,在Java中如下:

static long fibonacciBinet(long n) { 
    if (n <= 1) return n; 
    double sqrt5 = Math.sqrt(5); 
    long x = (long) ((Math.pow(1+sqrt5, n)-Math.pow(1-sqrt5, n))/(Math.pow(2, n)*sqrt5)); 

    return x; 
}