Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package exercises
- import scala.annotation.tailrec
- object TailRec {
- // На вход дан список чисел
- // числа последовательно складываются
- // необходимо найти число, которое первый раз повторно встречается в рез-те суммирования
- // если список кончается, а число не найдено, в конец списка дописываем исходный список и продолжаем вычисления
- // рез-том функции должно первое число, которое встречается дваджы впервые
- // нпр дан список List(1, -1)
- // первым значением, встретившимся дважды будет 0
- // 1 + (-1) | 0
- // 0 + 1 | 1
- // 1 + (-1) | 0
- // должна быть использована аннотация @tailrec
- // while и var запрещены
- // подумайте об исключениях
- // try catch не использовать
- // 2 балла
- def secondOccurrence(inp: List[Int]): Option[Int] = {
- def isAmountRepeat(current: Int, sumResults: List[Int]): Boolean = {
- sumResults.count((elem: Int) => elem == current) == 2
- }
- @tailrec
- def recurSum(numbers: List[Int], current: Int, sumResults: List[Int]): Int = {
- numbers match {
- case Nil | List() => {
- if (isAmountRepeat(current, sumResults))
- current
- else
- recurSum(inp, current, sumResults)
- }
- case x +: tail => {
- if (isAmountRepeat(current, sumResults))
- current
- else
- recurSum(tail, current + x, sumResults ++ List(current + x))
- }
- }
- }
- Some(recurSum(inp, 0, List()))
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement