Swift中的Fibonacci单行代码

3

我正在尝试一些代码高尔夫,我有这个函数:

    func fibonacci(n: Int) {

        var x1=0
        var x2=1
        var arr = [Int]()

        for _ in 1...n {
            arr.append(x1)
            let temp = x1+x2
            x1 = x2
            x2 = temp
        }
        print(arr)
    }

我想尝试一条命令,就是这样:

print((1...n).reduce(([Int](),[0,1]), { ($0.0 + [$0.1[0]],[$1.1[1],$1.1[1]+$1.1[0]])}))

但是我收到了这个无聊的编译器错误信息:

编译器无法在合理的时间内对此表达式进行类型检查;尝试将表达式分解为不同的子表达式

有更好的方法吗?谢谢

2个回答

6

您不需要构造一个Array。您可以使用sequence函数逐个生成Fibonacci数列:

sequence(first: (0, 1)) { a, b in (b, a + b) }
    .prefix(10)
    .forEach { a, _ in print(a) }

输出:

0
1
1
2
3
5
8
13
21
34

如果您想了解更多关于sequence的理论基础知识,请阅读有关无限展开函数的内容。

0

你的尝试使用所有默认参数很难阅读。尝试这样做的问题之一是传递到reduce中的Int实际上在闭包内不需要,并且你需要告诉Swift忽略它。使用默认参数很难做到这一点,但如果添加显式参数,则可以使用_来忽略其中一个。

以下是使用两个reduce语句的解决方案:

print((1...n).reduce([0, 1]) { (f, _) in f + [f.suffix(2).reduce(0, +)] })

第二个reduce用于添加通过.suffix(2)获得的上一次迭代的最后两个元素,然后使用+将其附加到数组中。

不必使用第二个reduce,你也可以直接将最后两个值相加:

print((1...n).reduce([0, 1]) { (f, _) in f + [f.last! + f[f.count - 2]] })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接