Как добавить в список, который вы возвращаете? - PullRequest
0 голосов
/ 05 марта 2020

Извините, если это глупый вопрос, так как я начинающий. У меня есть функция factors, которая выглядит следующим образом:

def factors (n:Int):List[Int] = {
  var xs = List[Int]()
  for(i <- 2 to (n-1)) {
    if(n%i==0) {xs :+ i}
  }
  return xs
}

Однако, если я делаю println(factors(10)), я всегда получаю List().

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

Операция :+ возвращает новый список, вы никогда не назначаете его для xs.

def factors (n:Int):List[Int] = {
  var xs = List[Int]()
  for (i <- 2 to (n - 1)) {
    if(n%i==0) {xs = xs :+ i}
  }
  return xs
}

Но вы действительно не должны использовать var. Они нам не очень нравятся в Scala. Также не используйте return в Scala. Это гораздо более загруженное ключевое слово, чем вы думаете. Прочитайте об этом здесь

Вот лучший способ сделать это.

def factors (n:Int): List[Int] =
  for {
    i <- (2 to (n - 1)).toList
    if (n % i) == 0
  } yield i

factors(10)

Вам тоже не нужно .toList, но вы не хотели связываться с вашими типами возврата. Вы можете настроить

Рабочая ссылка: https://scastie.scala-lang.org/haGESfhKRxqDdDIpaHXfpw

1 голос
/ 05 марта 2020

Вы можете рассматривать эту проблему как операцию фильтрации. Вы начинаете со всех возможных факторов и сохраняете те, где остаток при делении ввода на это число равен 0. Операция, которая делает это в Scala, равна filter, которая сохраняет значения, при которых конкретный тест является истинным, и удаляет остальные:

def factors(n: Int): List[Int] =
  (2 until n).filter(n % _ == 0).toList

Чтобы код был коротким, я также использовал краткую форму функции, где _ обозначает аргумент функции, поэтому n % _ означает n, деленное на текущий номер, который проверяется.

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