0

我正在尝试在 Swift 5 中实现斐波那契函数。当我在 Xcode Playground 上实现该函数时(我从CSDojo 的 youtube 视频中获取了该函数的代码),我遇到了这个错误消息

错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

最初,我认为错误必须来自下标索引超出范围。所以我再次检查了我的代码,似乎没有问题。现在我想知道为什么我在尝试运行时会从 Xcode Playground 收到此错误消息computeFiboBottomUp(n: 100)?它工作正常,直到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...
4

1 回答 1

1

您的代码中没有递归。

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

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

更高的值需要使用长/任意精度整数运算。

于 2021-12-06T08:30:44.637 回答