【问题标题】:Fibonacci one-liner in SwiftSwift 中的斐波那契单线
【发布时间】:2020-04-19 17:19:10
【问题描述】:

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

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

但我收到了这个蹩脚的编译器消息:

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

有没有更好的方法来做到这一点?谢谢

【问题讨论】:

    标签: swift reduce fibonacci


    【解决方案1】:

    您不需要实际构造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

    【讨论】:

      【解决方案2】:

      使用所有默认参数很难阅读您的尝试。之一 尝试这样做的问题是 Int 传递给 reduce 在闭包中实际上并不需要,您需要告诉 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]] })
      

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 2012-12-29
        • 1970-01-01
        • 2017-12-06
        • 2011-06-23
        • 1970-01-01
        相关资源
        最近更新 更多