scala - Findig the 2nd last item in the list, please explain this solution -


// pattern matching makes easy.   def penultimaterecursive[a](ls: list[a]): = ls match {     case h :: _ :: nil => h     case _ :: tail     => penultimaterecursive(tail)     case _             => throw new nosuchelementexception   } 

can comment doing line line?

is [a] generic in c# ?

h doesn't seem defined?

i think major part of algo recursive call:

case _ :: tail     => penultimaterecursive(tail) 

there doesnt' seem check 2 items in list, , taking 1st item 2nd last, confused!

the keys understanding pattern match realize x :: y only match list single item x followed rest of list y (which nil, or many elements), , _ means "there needs here, won't bother naming it". (and matches occur in order, , lists end nil.)

you're correct [a] generic type.

so, first line:

case h :: _ :: nil => h 

says, if our list looks (conceptually) node(h) -> node(whatever) -> nil, return h. two-element list first item selected. note nil not match arbitrary tail of list; matches end-of-list item nil. because of rule scala uses distinguish two: lower case variables treated wildcards have appropriate value filled in, while upper case variables treated constants match. (if must match lower-case name, can if surround backticks.)

okay, suppose it's not two-element list. if it's not empty, match

case _ :: tail => penultimaterecursive(tail) 

so if haven't got two-element list, throw away first item , try again. finally, if somehow never ended two-element list, to

case _ => throw new nosuchelementexception 

and we're done. (this case nil, actually, since possibility doesn't match other 2 entries.)


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -