2016-10-31 37 views
0
93nd数

我的斐波那契计算器似乎在相同数量的斐波纳契计算器堆栈溢出在斯威夫特

class FiboCalculator { 

    private static let instance = FiboCalculator() 
    private var cache: [Int] = [1,1] 
    private init(){} 

    // get the nth fibo number 
    class func getZeroIndexed(n: Int) -> Int { 
     if n < 0 { 
      return 0 
     } 
     else if n < instance.cache.count { 
      return instance.cache[n] 
     } 
     while n >= instance.cache.count { 
      print("going down, right now i have \(instance.cache.count) values cached") 
      instance.cache.append(instance.cache[instance.cache.count-1] + instance.cache[instance.cache.count-2]) 
     } 
     return instance.cache[n] 
    } 
} 

我试图递归地做它的第一个堆栈溢出真神速,总是,但我当每次有一个EXC_BAD_INSTRUCTION我试图获得第91个值。然后,我尝试按照上述方式进行,迭代而不是递归,并且每次尝试访问第93个值时都会得到一个EXC_BAD_INSTRUCTION。如果我从开始而不是从2开始填充10个值,它在尝试获得第93个时仍然失败。如果我拆分堆栈(解决n/2而缓存计数< n/2,然后继续)它仍然失败在93.我也只在模拟器上测试。我错过了为什么这是失败的东西?

回答

1

第93 Fibonacci数是12,200,160,415,121,876,738这超过2 − 1,因此它不能被表示为Int反正。

如果你真的想支持一个很大的数字,你应该使用BigInteger library

+1

你也可以使用显然鲜为人知的内置'NSDecimalNumber', – vadian

+0

@vadian NSDecimalNumber(在Swift 3中称为'Decimal')就像'float'或'double',它可以让你计算出到10^165(F_791),最不重要的数字将会丢失。 – kennytm

+0

那是至少*那大* ;-)的fib(792) – vadian

1

你四溢Int数据类型,因为FIB(93)的结果(12,200,160,415,121,876,738,大致1.22 x 10^19)大于Int64.max9,223,372,036,854,775,807,大约9.22 x 10^18)。因为Int是32位机器上的32位类型,所以在32位机器上,这将在更早的时间崩溃,在fib(47)(2,971,215,073)处。 Int32.max只是2,147,483,647