Swift斐波那契函数第93次迭代触发EXC_BAD_INSTRUCTION错误求助
解决Swift中生成斐波那契数时的溢出错误
你遇到的这个问题本质是整数溢出导致的!咱们来一步步理清楚:
问题根源
Int64类型能容纳的最大值是9223372036854775807,而第93个斐波那契数是12200160415121876738——这个数值已经远远超出了Int64的范围。当你执行numbers[x-1] + numbers[x-2]时,两个大数相加的结果撑爆了Int64的存储上限,Swift作为静态类型语言,默认会严格触发溢出错误(也就是你看到的EXC_BAD_INSTRUCTION),它不允许这种隐式的不安全数值操作。
两种解决方案
根据你的需求,有两种靠谱的处理方式:
1. 用溢出运算符避免崩溃(但结果不准确)
Swift提供了专门的溢出运算符&+,它会在溢出时自动截断数值,虽然不会崩溃,但得到的结果是错误的,适合只需要避免崩溃、不追求准确值的场景:
func buildFibonacci(){ var numbers: [Int64] = [0,1] for x in (2...99) { numbers.append(numbers[x-1] &+ numbers[x-2]) // 替换为溢出加法 } print(numbers) } buildFibonacci()
2. 用任意精度整数获取准确结果
如果需要得到完全正确的前100个斐波那契数,推荐使用BigInt类型,它可以处理任意大小的整数,完全不会有溢出问题。你需要先引入第三方库BigInt(比如attaswift的开源实现):
首先在Swift Package Manager的Package.swift中添加依赖:
dependencies: [ .package(url: "https://github.com/attaswift/BigInt.git", from: "5.3.0") ]
然后修改你的代码:
import BigInt func buildFibonacci(){ var numbers: [BigInt] = [0,1] for x in (2...99) { numbers.append(numbers[x-1] + numbers[x-2]) } print(numbers) } buildFibonacci()
这样就能顺利生成前100个准确的斐波那契数啦。
顺带提一句:静态类型语言对类型安全的要求很高,这种严格的溢出检查其实是在帮你规避潜在的数值错误,习惯之后会觉得挺贴心的~
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

