#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 Я удалил его.