Специальная функция в scala для рекурсивного объединения двух списков: «конкат»не используется

#scala #recursion #functional-programming

Вопрос:

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

 def concatList(lleft: List[String], lright: List[String]): List[String] {

  }
 

Комментарии:

1. Начните с подписи вашей функции.

2. Сервер Discord был бы лучшим местом для того, чтобы задать этот вопрос.

3.@Usr654789 discord.gg/Eswfshby users.scala-lang.org/t/…

4. @Usr654789 отлично, тогда звучит как хороший подход для рекурсивного метода. Просто напишите это с помощью кода 🙂

5. @Usr654789 docs.scala-lang.org/tour/pattern-matching.html

Ответ №1:

Надеюсь, вы уже решили свой вопрос с домашним заданием. Для тех, кто столкнется с этим в будущем, вы можете использовать хвостовую рекурсию следующим образом

 def concatList(lleft: List[String], lright: List[String]): List[String] = lright match {
  case Nil => lleft  // base condition
  case head :: tail =>  // add first element to end of lleft and recurse
    concatList(lleft :  head, tail)
}
 

Комментарии:

1. Почему 3-й случай для?

2. @DmytroMitin крайний случай, если пользователь переходит null ко второму аргументу. Это дало бы неприятный MatchError результат в противном случае.

3. Если вы начнете обрабатывать нули, что будет, когда lleft будет null и lright есть head :: tail ? NPE не лучше, чем MatchError. Я думаю, что если возможны нули, то лучше иметь Option[List[String]] и справляться с этим Option.apply(..) .

4. Я сделал это вчера вечером на каком-то канале Discord, Они посоветовали использовать ::: , это все равно быстрее, но без третьего случая

5. @DmytroMitin Я удалил его.