Swift中的斐波那契一线

问题描述 投票:2回答:2

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

    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编译器消息:

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

有更好的方法吗?谢谢

swift reduce fibonacci
2个回答
5
投票

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

sequence

输出:

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
投票

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

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

reduce

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


代替使用第二个+,您也可以只添加最后两个值:

reduce
© www.soinside.com 2019 - 2024. All rights reserved.