斯威夫特的斐波那契一线

时间:2019-12-31 04:41:10

标签: swift reduce fibonacci

我正在尝试打高尔夫球,我具有以下功能:

    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]])}))

但是我得到了这个lame-o编译器消息:

  

编译器无法合理地对该表达式进行类型检查   时间;尝试将表达式分成不同的子表达式

有更好的方法吗?谢谢

2 个答案:

答案 0 :(得分:5)

您实际上不需要构造Array。您可以使用the sequence function一次生成一个斐波那契:

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的理论基础,请阅读anamorphisms

答案 1 :(得分:0)

使用所有默认参数很难读取您的尝试。之一 尝试执行此操作的问题在于,闭包内部实际上并不需要传递到Int的{​​{1}},而您需要告诉Swift忽略它。使用默认参数很难做到这一点,但是如果您添加显式参数,则可以对要忽略的参数使用reduce

这是使用两个_语句的解决方案:

reduce

第二个print((1...n).reduce([0, 1]) { (f, _) in f + [f.suffix(2).reduce(0, +)] }) 用于添加由reduce获得的先前迭代的最后两个元素,然后使用.suffix(2)将其附加到数组中。


除了使用第二个+,您还可以只添加最后两个值:

reduce