我的Fibonacci计算器看起来堆栈溢出非常快,总是在相同的数字
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]
}
}
我最初尝试递归,但每当我试图获得第91个值时,我得到了一个EXC_BAD_INSTRUCTION。然后我尝试用上面的方法,迭代而不是递归,每次我尝试访问93rd值时,我得到一个EXC_BAD_INSTRUCTION。如果我从头开始用10个值填充缓存而不是2,那么在尝试获得93时它仍然会失败。如果我拆分堆栈(在缓存计数&lt; n / 2时解析n / 2,然后继续)它仍然在93处失败。我也只是在模拟器上测试它。我错过了为什么会失败的事情吗?
答案 0 :(得分:1)
第93个斐波纳契数是12,200,160,415,121,876,738,超过2 63 - 1,因此无论如何它都不能表示为Int
。
如果你真的想支持那么大的数字,你应该使用BigInteger library。
答案 1 :(得分:1)
您溢出Int
数据类型,因为fib(93)(12,200,160,415,121,876,738
,大致1.22 x 10^19
)的结果大于Int64.max
({{1} },或大致9,223,372,036,854,775,807
)。
在32位计算机上,这将在fib(47)(9.22 x 10^18
)时更早崩溃,因为2,971,215,073
在32位计算机上是32位类型。 Int
仅为Int32.max
。