斐波那契计算器堆栈在Swift

时间:2016-10-31 15:15:01

标签: swift

我的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处失败。我也只是在模拟器上测试它。我错过了为什么会失败的事情吗?

2 个答案:

答案 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