In primo luogo, io non reinventare la ruota ... il metodo di massima già è definito in RichInt
, in modo da poter scrivere a max b
, per a
e b
interi.
Inoltre,
slice
è obsoleto, quindi
anziché lst.slice(0, num)
userei lst.take(num)
. Probabilmente i metodi deprecati spariranno quando verrà lanciato Scala 2.8.
EDIT: Infatti, come Daniel indicate, slice(Int, Int)
non è obsoleto. Avevo abbastanza fretta quando ho inizialmente scritto questo, e stavo pensando a slice(Int)
, che equivale a drop(Int)
. Trovo ancora che lst.take(num)
sia più chiaro di lst.slice(0, num)
:).
(nitpick) Anche l'ultima riga non viene compilata poiché si è dimenticato di aggiungere Nil
alla fine della sequenza di svantaggi. 1::2::3::4
, finirebbe invocando ::
su un Int
, che non ha questo metodo. Ecco perché è necessario aggiungere Nil
alla fine (invocare ::
su Nil
).
Inoltre, l'algoritmo che hai utilizzato non è evidente a prima vista. Il modo in cui vorrei scrivere questo è il seguente:
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
sento che l'ultima riga spiega molto bene ciò che l'algoritmo dovrebbe fare - prendere una finestra scorrevole della lista, calcolare il prodotto in quella finestra scorrevole e quindi ottenere il massimo dei prodotti calcolati (ho implementato la massima funzione come sort(_ > _).head
per pigrizia, avrei potuto fare qualcosa O (n) piuttosto che O (n log (n)) se la prestazione era critica ... continua a funzionare sotto un secondo però).
Si noti che la funzione di scorrimento sarà nella libreria di Scala 2.8 (vedere Daniel's post, da cui mi sono ispirato a scrivere questa definizione di scorrimento).
MODIFICA: Oops ...mi dispiace per lo /:
. Mi piace solo la concisione di ciò e il fatto che l'elemento iniziale della piega viene prima della lista. Si potrebbe equivalentemente scrivere product
come il seguente, per essere più espliciti:
def product(xs: List[Int]): Int = xs.foldLeft(1)(_ * _)
-- Flaviu Cipcigan
Grazie Flaviu, questa è la risposta che speravo. Mi ci sono voluti 5 minuti per capire la tua soluzione, principalmente a causa della sintassi molto concisa, che usi. Non conosco ancora gli operatori, quindi qualcosa come "1 /: xs" è completamente criptico a prima vista. –
Contento di aver potuto aiutare. Ho modificato il post per fornire la definizione meno criptica del prodotto;). –
La 'slice' è deprecata? Non vedo alcun avviso su 2.8 o 2.7.4. –