Swift随机崩溃[重复]

ct2axkht  于 2023-04-28  发布在  Swift
关注(0)|答案(2)|浏览(136)

此问题已在此处有答案

Runtime Error when Trying Bottom Up Approach to Implement Fibonacci function in Swift?(1个答案)
3天前关闭。
我正在学习使用swift在swift playground中编写应用程序,但我对以下问题感到非常困惑。我想简单地编写一个斐波那契程序来测试它的能力,但是它在随机迭代次数之后随机崩溃。(8、11、55等)代码如下:

var num1 = 0, num2 = 1
for i in 0..<100{
    print(num1)
    var temp = num2
    num2 += num1
    num1 = temp
}
zzwlnbp8

zzwlnbp81#

您的实现的问题是,它将继续打印序列中的数字,直到溢出用于表示数字的数据类型的界限。试试这个。

var num1 = 0, num2 = 1
while num1 <= Int.max - num2 {
    print(num1)
    let temp = num2
    num2 += num1
    num1 = temp
}

这是避免整数溢出的更好的解决方案。

func fibonacci(upTo n: Int) -> [Int] {
    guard n > 0 else {
        return []
    }
    var fib = [0, 1]
    while fib.last! < n {
        let nextFib = fib.last! + fib[fib.count - 2]
        guard nextFib <= n else {
            break
        }
        fib.append(nextFib)
    }
    return fib
}
wfypjpf4

wfypjpf42#

这是一个整数溢出问题,当下一个斐波那契数(num2)变得太大而不能表示为有符号的64位整数时。崩溃似乎是随机的,因为程序的输出是缓冲的,并且不是所有已打印的消息都是可见的。我尝试添加一个延迟来尝试删除缓冲并强制输出出现:

var num1 = 0, num2 = 1
for i in 0..<100{
    print(i, num1)
    usleep(250_000)
    
    var temp = num2
    num2 += num1
    num1 = temp
}

在iPad上的Swift Playgrounds中,这可靠地显示了我的第91位:

89 1779979416004714189
90 2880067194370816120
91 4660046610375530309

由于Int.Max9223372036854775807,并且代码是打印num1,这意味着num2已经在i==90迭代中被设置为7540113804746346429。在代码可以为i==92打印num1之前,它需要将4660046610375530309添加到num2(在i==91迭代中),这对于有符号的64位整数(12200160415121876738)来说太大了。

相关问题