Во-первых, я бы не стал изобретать велосипед ... метод max уже определен в RichInt
, поэтому вы можете написать a max b
, для a
и b
целых чисел.
ALso, slice
устарело, поэтому вместо lst.slice(0, num)
я бы использовал lst.take(num)
. Устаревшие методы, вероятно, исчезнут при запуске Scala 2.8.
РЕДАКТИРОВАТЬ: Действительно, как указал Даниил , slice(Int, Int)
не считается устаревшим. Я очень спешил, когда впервые написал это, и думал о slice(Int)
, что эквивалентно drop(Int)
. Я все еще нахожу lst.take(num)
более понятным, чем lst.slice(0, num)
:).
(nitpick) Ваша последняя строка также не компилируется, так как вы забыли добавить Nil
в конец вашей последовательности минусов. 1::2::3::4
, в конечном итоге вызовет ::
на Int
, который не имеет этого метода. Вот почему вам нужно добавить Nil
в конец (вызвать ::
на Nil
).
Кроме того, алгоритм, который вы использовали, на первый взгляд неочевиден. Я бы написал так:
val numbers = /*"--the string of numbers--"*/.map(_.asDigit).toList
def sliding[A](xs: List[A], w: Int): List[List[A]] = {
for(n <- List.range(0, xs.size - w))
yield xs drop n take w
}
def product(xs: List[Int]): Int = (1 /: xs) (_ * _)
sliding(numbers, 5).map(product).sort(_ > _).head
Мне кажется, что последняя строка довольно хорошо объясняет, что должен делать алгоритм - взять скользящее окно списка, вычислить произведение в этом скользящем окне и затем получить максимум рассчитанных произведений (я реализовал максимум функционируя как sort(_ > _).head
из-за лени, я мог бы сделать что-то O (n), а не O (n log (n)), если производительность была критической ... хотя она все еще работает менее секунды).
Обратите внимание, что функция скольжения будет в библиотеке Scala 2.8 (см. Пост Даниэля , откуда я был вдохновлен при написании этого определения скольжения).
РЕДАКТИРОВАТЬ: Упс ... извините за /:
. Мне просто нравится его краткость и тот факт, что начальный элемент сгиба стоит перед списком. Вы можете эквивалентно написать product
следующим образом, чтобы быть более точным:
def product(xs: List[Int]): Int = xs.foldLeft(1)(_ * _)
-- Flaviu Cipcigan