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个值时仍然会失败。如果我拆分堆栈(在缓存计数第93个斐波那契数是12200160415121876738,比263多− 1,因此无论如何它不能表示为
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),它至少有那么大;-)