Свифт код Эйлера р1 нужна помощь в понимании - PullRequest
0 голосов
/ 27 ноября 2018

Может кто-нибудь помочь объяснить этот раздел кода?Я ежедневно работаю над проблемами Эйлера, используя различные способы, которые я нашел в интернете, и это меня озадачило.

Я не совсем понимаю, зачем нужен "let range" и что он делает ... ни {переменная} в ... Я думаю, я могу решить остальное с некоторыми исследованиями, но эти две частиниже полностью сбивают меня с толку.

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 голосов
/ 27 ноября 2018

Похоже, диапазон не используется.

Когда вызывается фильтр метода, он использует замыкание.Это замыкание является методом, который имеет определенную «форму», которая является

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-й аргумент. Время от времени вы можете видеть это всплывающее окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...