Fibonacci计算器堆栈在Swift中第93位溢出
我的斐波那契计算器似乎堆叠溢出非常迅速,总是在同一个数字Fibonacci计算器堆栈在Swift中第93位溢出,swift,Swift,我的斐波那契计算器似乎堆叠溢出非常迅速,总是在同一个数字 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 {
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]
}
}
类光纤计算器{
私有静态let实例=FiboCalculator()
私有变量缓存:[Int]=[1,1]
私有init(){}
//获取第n个fibo编号
类func getZeroIndexed(n:Int)->Int{
如果n<0{
返回0
}
如果n=instance.cache.count{
打印(“正在下降,现在我缓存了\(instance.cache.count)值”)
instance.cache.append(instance.cache[instance.cache.count-1]+instance.cache[instance.cache.count-2])
}
return instance.cache[n]
}
}
起初我试着递归地执行,但每次我尝试获取第91个值时,都会得到一条EXC_BAD_指令。然后我尝试用上面的方法,迭代而不是递归,每次我尝试访问第93个值时都会得到一条EXC_BAD_指令。如果我从一开始就用10个值而不是2个值填充缓存,那么在尝试获取第93个值时仍然会失败。如果我拆分堆栈(在缓存计数
Int
如果你真的想支持这么大的数字,你应该使用。你溢出了
Int
数据类型,因为fib(93)的结果(12200160415121876738
,大致1.22 x 10^19
)大于Int64.max
(9223372036854775807
,或者大致9.22 x 10^18
)
在32位机器上,这将更早地崩溃,在fib(47)(
2971215073
),因为Int
是32位机器上的32位类型Int32.max
仅为2147483647
您可以使用显然鲜为人知的内置NSDecimalNumber
,too@vadianNSDecimalNumber(在Swift 3中称为Decimal
)类似于float
或double
,但它允许您最多计算10^165(F_791),最低有效位将丢失。这就是fib(792),它至少有那么大;-)