Advertisement
Lusien_Lashans

TailRec

Mar 22nd, 2019
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.80 KB | None | 0 0
  1. package exercises
  2.  
  3. import scala.annotation.tailrec
  4.  
  5.  
  6. object TailRec {
  7.  
  8.   //  На вход дан список чисел
  9.   //  числа последовательно складываются
  10.   //  необходимо найти число, которое первый раз повторно встречается в рез-те суммирования
  11.   //  если список кончается, а число не найдено, в конец списка дописываем исходный список и продолжаем вычисления
  12.   //  рез-том функции должно первое число, которое встречается дваджы впервые
  13.   //  нпр дан список List(1, -1)
  14.   //  первым значением, встретившимся дважды будет 0
  15.   //  1 + (-1) | 0
  16.   //  0 + 1    | 1
  17.   //  1 + (-1) | 0
  18.  
  19.   //  должна быть использована аннотация @tailrec
  20.   //  while и var запрещены
  21.   //  подумайте об исключениях
  22.   //  try catch не использовать
  23.   //  2 балла
  24.  
  25.     def secondOccurrence(inp: List[Int]): Option[Int] = {
  26.  
  27.         def isAmountRepeat(current: Int, sumResults: List[Int]): Boolean = {
  28.             sumResults.count((elem: Int) => elem == current) == 2
  29.         }
  30.  
  31.         @tailrec
  32.         def recurSum(numbers: List[Int], current: Int, sumResults: List[Int]): Int = {
  33.             numbers match {
  34.                 case Nil | List() => {
  35.                     if (isAmountRepeat(current, sumResults))
  36.                         current
  37.                     else
  38.                         recurSum(inp, current, sumResults)
  39.                 }
  40.                 case x +: tail => {
  41.                     if (isAmountRepeat(current, sumResults))
  42.                         current
  43.                     else
  44.                         recurSum(tail, current + x, sumResults ++ List(current + x))
  45.                 }
  46.             }
  47.         }
  48.  
  49.         Some(recurSum(inp, 0, List()))
  50.     }
  51.  
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement