2016-06-30 4 views
1

В разделе 17.1 (Collections) программирования в Scala (Одерски), есть строка, которая говорит:Scala ListBuffer предотвращает потенциальное переполнение стека?

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

Каким образом использование ListBuffer предотвращает возможность переполнения стека? ... Ни один каламбур ;-)

ответ

0

Сама книга дает the answer:

Если вы можете создать список в нужном порядке, предваряя, но рекурсивный алгоритм, который будет необходим не хвостовая рекурсия , вы можете использовать вместо выражения или для цикла while и ListBuffer.

An example задается для функции, которая получает приращение каждый элемент List без использования функции map.

def incAllUnsafe(xs: List[Int]): List[Int] = xs match { 
    case List() => List() 
    case x :: xs1 => x + 1 :: incAllUnsafe(xs1) 
} 

def incAllSafe(xs: List[Int]): List[Int] = { 
    val buf = new scala.collection.mutable.ListBuffer[Int] 
    for (x <- xs) buf += x + 1 
    buf.toList 
} 
Смежные вопросы