首页 > 解决方案 > EXC_BAD_INSTRUCTION code=EXC_I386_INVOP 斐波那契计数函数

问题描述

我是 Swift(和非动态类型语言)的新手,并试图制作一个函数来制作前 100 个斐波那契数的数组。

就这个:

func buildFibonacci(){
    var numbers: [Int64] = [0,1]
    for x in (2...99) {    
        numbers.append(numbers[x-1] + numbers[x-2])
    }
    print(numbers)
}

buildFibonacci()

但是当我运行它时,在第 93 次迭代时出现错误:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). 据我了解,它是在求和运算中提出的。

我猜这与 Int 的大小有关,所以我将其更改为 Int64,但看起来问题出在其他问题上。如果很重要,我使用 swift 4.1。有人可以帮我吗?

标签: swift4

解决方案


您的假设是正确的,这是一个溢出异常,数字变得太高而无法用 64 位表示。无论如何,在 64 位机器IntInt64,类型更改没有区别。

一种解决方案是使用NSDecimalNumber不限于 64 位并提供基本算术方法的方法。

func buildFibonacci(){
    var numbers: [NSDecimalNumber] = [.zero, .one]
    for x in 2...99 {
        numbers.append(numbers[x-1].adding(numbers[x-2]))
    }
    print(numbers)
}

buildFibonacci()

推荐阅读