快速代码Euler p1需要帮助理解

时间:2018-11-27 09:17:43

标签: swift

有人可以帮助解释这段代码吗?我每天都使用我在互联网上找到的不同方法来处理Euler问题,这让我感到很困惑。

我不太明白为什么需要“ let range”及其作用……也不是……中的{variable}。我想我可以通过一些研究解决其余问题,但是以下两部分是完全使我困惑。

let range = 1...9
let anser = Array(1...9).filter {
    num in
    return ((num % 3 == 0) || (num % 5 == 0))
}.reduce(0) {
    x, y in
    return x + y
}

print(anser)

1 个答案:

答案 0 :(得分:0)

似乎没有使用范围。

调用方法过滤器时,它使用闭包。这种闭合是一种具有特定“形状”的方法,即

func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]

在该代码中看到的是一种快捷语法,可用于指定Element参数。

因此,filter将采用1到9范围内的每个值,并将其传递到过滤器闭包,在过滤器闭包中将测试其是否可以被3或5整除。

写这个的更长的方法是:

func f(num: Int) -> Bool {

    return (num % 3 == 0) || (num % 5 == 0)
}

(1...9).filter(f)

其中f是我们定义的函数。

reduce部分要复杂一些,因为reduce函数会得到一个初始结果和一个结束符。

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

完整代码的简写如下

func f(num: Int) -> Bool {

    return (num % 3 == 0) || (num % 5 == 0)
}

func r(x: Int, y: Int) -> Int {

    return x + y
}

(1...9).filter(f).reduce(0, r)

为了获得一点乐趣,我们可以编写

(1...9).filter { ($0 % 3 == 0) || ($0 % 5 == 0) }.reduce(0, { $0 + $1 })

$ n构造是对传入的第n个参数的引用。您可能会不时看到此弹出窗口。