在 Swift 中尝试使用自下而上的方法实现斐波那契函数时出现运行时错误?

Runtime Error when Trying Bottom Up Approach to Implement Fibonacci function in Swift?

我正在尝试在 Swift 5 中实现斐波那契函数。当我在 Xcode 游乐场上实现该函数时(我从 CSDojo's youtube video 中获取了该函数的代码),我遇到了这条错误消息

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

起初我以为错误一定是下标索引超出范围。所以我再次检查了我的代码,似乎没有问题。现在我想知道为什么当我尝试 运行 computeFiboBottomUp(n: 100) 时从 Xcode 游乐场收到此错误消息?它工作正常,直到 computeFiboBottomUp(n:35)

是不是栈上的递归调用太多,编译器处理不了?还是我的代码可能包含错误?

func computeFiboBottomUp(n: Int) -> Int {
    var bottom_up: [Int?] = []
    if bottom_up.isEmpty {
        for _ in 0...n {
            bottom_up.append(nil)
        }
    }
    if n == 1 || n == 2 { return 1 }
    bottom_up[1] = 1
    bottom_up[2] = 1
    for i in 3...n {
        bottom_up[i] = bottom_up[i-1]! + bottom_up[i-2]!
    }
    return bottom_up[n]!
}

computeFiboBottomUp(n: 5)
computeFiboBottomUp(n: 35)
computeFiboBottomUp(n: 100) // error...

您的代码中没有递归。

请注意 Fib(35) 对于整数溢出来说太小了,但是 Fib(100) 对于 32 位和 64 位整数来说肯定太大了,所以你的编译器会捕获整数溢出错误。

您可以为 32 位有符号整数设置限制 n=41,为 64 位有符号整数设置 n=92。

更高的值需要使用 long/arbitrary 精度整数算法。