Как я могу сделать список кортежей в scala в функции? - PullRequest
1 голос
/ 13 апреля 2020

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

def tryToClaimPosition(player: Int, horizontal: Int , vertical: Int , list: List[(Int, Int)]): Unit = {
if (vertical == gridsize - 1) {
  println(list);
}
if (horizontal < gridsize - 1) {
  if (gameBoard(horizontal)(vertical) == player) {
    val tuple = (horizontal,vertical)
    val list2 = list :: tuple
    tryToClaimPosition(player, horizontal + 1, vertical, list2)
  else {
    tryToClaimPosition(player, horizontal + 1, vertical, list)
  }
}

. Как вы видите из приведенного выше фрагмента, у меня есть список кортежей и у меня есть кортеж, но я не могу его добавить.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Вместо этого я бы использовал неизменный список, это был бы аккумулятор. Это было бы более функционально. Функция не будет иметь побочных эффектов и будет возвращать результирующее List:

def tryToClaimPosition(player: Int, horizontal: Int , vertical: Int , list: List[(Int, Int)]): List[(Int, Int)] = {
  if (vertical == gridsize - 1) {
    list.reverse
  }
  if (horizontal < gridsize - 1) {
    if (gameBoard(horizontal)(vertical) == player) {
      val tuple = (horizontal, vertical)
      tryToClaimPosition(player,horizontal + 1, vertical, tuple::list)
    else {
      tryToClaimPosition(player,horizontal + 1, vertical, list)
    }
  } else Nil
}

Обратите внимание, что я добавил кортеж к списку, потому что это занимает постоянное время (добавление пропорционально размеру List). Вот почему я возвращаю list.reverse, чтобы сохранить первоначальный порядок.

Также я спросил о случае, когда horizontal > gridsize - 1. Ваша программа ничего не делает, поэтому я предполагаю, что ничего не должно быть возвращено, следовательно, Nil в предложении else. Это необходимо, чтобы функция всегда возвращала значение.

2 голосов
/ 13 апреля 2020

В вашем коде много явных логик c и синтаксических ошибок. Наиболее уместным для вашего вопроса является тот факт, что list :: tuple не будет компилироваться, потому что правильная сторона :: метода должна быть List.

. Используйте :: для добавлять, а не добавлять к List.

...