有人可以帮助解释这段代码吗?我每天都使用我在互联网上找到的不同方法来处理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)
答案 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个参数的引用。您可能会不时看到此弹出窗口。