how to find the max value in an IntList? - list
I'm writing a function which will find the largest element in an IntList. I know how to do this in Java, but can't understand how to do this at Scala.
I made it, Here is what I have so far, I think this should be it.
abstract class IntList
case class Nil() extends IntList
case class Cons(h: Int, t: IntList) extends IntList
object ListFuns {
// return the maximum number in is
// return the maximum number in is
def maximum(is: IntList): Int = is match {
case Nil() => 0
case list => max(head(is), tail(is))
}
def head(l : IntList) : Int = l match {
case Nil() => 0
case Cons(e,tail) => e
}
def tail(l : IntList) : IntList = l match {
case Nil() => Nil()
case Cons(e,tail) => tail
}
def max(n : Int, l : IntList) : Int = l match {
case Nil() => n
case l => {
val h = head(l)
var champ = 0
if(n > h) {
champ = n
n
}
else{
champ = h
h
}
if(tail(l) == Nil()){
champ
}
else{
max(champ, tail(l))
}
}
}
}
Pattern matching would make it much shorter :
def maximum(l: IntList) : Int = l match {
case Cons(singleValue, Nil) => singleValue
case Nil() => // you decide, 0, the min value of ints, throw....
case Cons(head, tail) =>
val maxOfTail = maximum(tail)
if(maxOfTail > head) maxOfTail else head
}
minor notes:
you can change case class Nil() to case object Nil
the last two lines should be just head max maximum(tail), or head.max(maximum(tail)), whichever you are more comfortable with (they are the same thing).
This is just a starting point, as you learn further, you will find that my method not being tail-recursive is not too good. You might also consider whether you could return an Option to account for the empty list case. Also, notice that implementation of maximum, minimum, sum, product... are very similar, and try to factor that out.
Related
Split a list into half by even and odd indexes? TailRecursive + match
Define a tail recursive function:def divide[A](l: List[A]): (List[A], List[A]) that will split the list into two. In the first, there will be elements on even indexes, in the second, there will be elements on odd indexes. for List (1, 3, 5, 6, 7), the function should return: (List (1, 5, 7), List (3, 6)). import scala.annotation.tailrec object Main extends App { def divide[A](l: List[A]): (List[A], List[A]) = { #tailrec def helper(l1: List[A], l2: List[A]) = { ... match { case Any help would be great, i dont even know how to start, because i cant simply use x % 2 == 0 with case..
Another option you have, which is not a tailrec, but does not reverse the list, is: def divide[A](l: List[A]): (List[A], List[A]) = { def helper(l: List[A]): (List[A], List[A]) = l match { case Nil => (Nil, Nil) case head :: Nil => (List(head), Nil) case even :: odd :: rest => val (evenList, oddList) = helper(rest) (even :: evenList, odd :: oddList) } helper(l) } Code run at Scastie. If you'd like to do that in the functional way, you can do: val (evenWithIndex, oddWithIndex) = List(1, 3, 5, 6, 7).zipWithIndex.partition(_._2 % 2 == 0) val even = evenWithIndex.map(_._1) val odd = oddWithIndex.map(_._1)
Maybe you could think of the base case first - A list with one element. In that case, you need to put that in the list of odd indices. If you have more elements, you need to call the same method, but for the second call, you need to put the element in the list of event indices. Also, you may notice that, if you have an odd number of elements in the list, you have more numbers in the list of odd indices than that of the even. In case if you have an even number of elements, you have an equal number of elements in both lists. So you may think of a function like below, import scala.annotation.tailrec def divide[A](l: List[A]): (List[A], List[A]) = { #tailrec def helper(l: List[A], list1:List[A], list2:List[A]):(List[A], List[A]) = { l match { case Nil if list1.size > list2.size => (list1.reverse, list2.reverse) // case 1: odd number of elements case Nil if list1.size < list2.size => (list2.reverse, list1.reverse) // case 2: odd number of elements case Nil if list1.size == list2.size => (list1.reverse, list2.reverse) // case 3: even number of elements case head::tail => helper(tail, list2, head::list1) } } helper(l, List(), List()) } Now if you see closely, case 1 never occurs as we are swapping the positions of the lists of the odd and even indices. So, we can remove this. import scala.annotation.tailrec def divide[A](l: List[A]): (List[A], List[A]) = { #tailrec def helper(l: List[A], list1:List[A], list2:List[A]):(List[A], List[A]) = { l match { case Nil if list1.size < list2.size => (list2.reverse, list1.reverse) // case 1: odd number of elements case Nil => (list1.reverse, list2.reverse) // case 2: even number of elements case head::tail => helper(tail, list2, head::list1) } } helper(l, List(), List()) } Update Based on the comment by #Dima, I have removed the extra check from the second case. Also, the code based on the approach he mentioned is, import scala.annotation.tailrec def divide[A](l: List[A]): (List[A], List[A]) = { #tailrec def helper(l: List[A], i: Int, result:(List[A], List[A])):(List[A], List[A]) = l match { case Nil => (result._1.reverse, result._2.reverse) case head::tail if i%2 == 0 => helper(tail, (i+1), (head::result._1, result._2)) case head::tail => helper(tail, (i+1), (result._1, head::result._2)) } helper(l, 0, (List(), List())) }
Is there a -- (minus minus) operator in Scala?
I've come across this operator in a Scala implementation of a graph (that you can find the example here, where two lists are interponed the operator -- and also two Maps. abstract class GraphBase[T, U] { case class Edge(n1: Node, n2: Node, value: U) { def toTuple = (n1.value, n2.value, value) } case class Node(value: T) { var adj: List[Edge] = Nil // neighbors are all nodes adjacent to this node. def neighbors: List[Node] = adj.map(edgeTarget(_, this).get) } var nodes: Map[T, Node] = Map() var edges: List[Edge] = Nil // If the edge E connects N to another node, returns the other node, // otherwise returns None. def edgeTarget(e: Edge, n: Node): Option[Node] override def equals(o: Any) = o match { case g: GraphBase[_,_] => (nodes.keys.toList -- g.nodes.keys.toList == Nil && edges.map(_.toTuple) -- g.edges.map(_.toTuple) == Nil) case _ => false } def addNode(value: T) = { val n = new Node(value) nodes = Map(value -> n) ++ nodes n } } My current interpreter does not recognize it, so I am wondering where is this operator coming from? Does it mean list subtraction? Is it valid Scala code?
You can alter an implementation of equals method to avoid usage of --: override def equals(o: Any) = o match { case g: GraphBase[_,_] => (nodes.keySet == g.nodes.keySet && edges.map(_.toTuple).toSet == g.edges.map(_.toTuple).toSet) case _ => false }
Scala: List Operations
In Scala, define the function slice(from, until, xs) that selects an interval of elements from the (string) list xs such that for each element x in the interval the following invariant holds: from <= indexOf(x) < until. from: the lowest index to include from this list. until: the highest index to exclude from this list. returns: a list containing the elements greater than or equal to index from extending up to (but not including) index until of this list. example: def test { expect (Cons("b", Cons("c", Nil()))) { slice(1, 3, Cons("a", Cons("b", Cons("c", Cons("d", Cons("e", Nil())))))) } } another example: def test { expect (Cons("d", Cons("e", Nil()))) { slice(3, 7, Cons("a", Cons("b", Cons("c", Cons("d", Cons("e", Nil())))))) } } and this is what I have, but its not that correct. Can someone help me with it? abstract class StringList case class Nil() extends StringList case class Cons(h: String, t: StringList) extends StringList object Solution { // define function slice def slice(from : Int, until : Int, xs : StringList) : StringList = (from, until, xs) match { case (_,_,Nil()) => Nil() case (n, m, _) if(n == m) => Nil() case (n, m, _) if(n > m) => Nil() case (n, m, _) if(n < 0) => Nil() case (n, m, xs) if(n == 0)=> Cons(head(xs), slice(n+1,m,tail(xs))) case (n, m, xs) => { //Cons(head(xs), slice(n+1,m,tail(xs))) if(n == from) { print("\n") print("n == m " + Cons(head(xs), slice(n+1,m,tail(xs)))) print("\n") Cons(head(xs), slice(n+1,m,tail(xs))) } else slice(n+1,m,tail(xs)) } } def head(t : StringList) : String = t match { case Nil() => throw new NoSuchElementException case Cons(h, t) => h } def tail(t : StringList) : StringList = t match { case Nil() => Nil() case Cons(h, t) => t } /* def drop(n : Int, t : StringList) : StringList = (n, t) match { case (0, t) => t case (_, Nil()) => Nil() case (n, t) => drop(n-1 , tail(t)) }*/ }//
This works add a method to find the element at given index : trait StringList case class Nil() extends StringList case class Cons(h: String, t: StringList) extends StringList object Solution { def numberOfElements(str: StringList, count: Int = 0): Int = { if (str == Nil()) count else numberOfElements(tail(str), count + 1) } def elemAtIndex(n: Int, str: StringList, count: Int = 0): String = { if (str == Nil() || n == count) head(str) else elemAtIndex(n, tail(str), count + 1) } def head(str: StringList): String = str match { case Nil() => throw new NoSuchElementException case Cons(h, t) => h } def tail(str: StringList): StringList = str match { case Nil() => Nil() case Cons(h, t) => t } // define function slice def slice(from: Int, until: Int, xs: StringList): StringList = (from, until, xs) match { case (n, m: Int, _) if n == m || n > m || n < 0 => Nil() case (n, m: Int, xs: StringList) => if (m > numberOfElements(xs)) { slice(n, numberOfElements(xs), xs) } else { Cons(elemAtIndex(n, xs), slice(n + 1, m, xs)) } } } scala> Solution.slice(1, 3, Cons("a", Cons("b", Cons("c", Cons("d", Cons("e", Nil())))))) res0: StringList = Cons(b,Cons(c,Nil())) scala> Solution.slice(3, 7, Cons("a", Cons("b", Cons("c", Cons("d", Cons("e", Nil())))))) res0: StringList = Cons(d,Cons(e,Nil()))
Update the values of a list with their absolute values
Newbie to scala. I am trying to make this code to work for a few hours now . It is intended to update the List[Int](list of integers) with absolute values of the integers. Took a long time to figure out that List is immutable, so found that ListBuffer can be the saviour, but eventually in returning it back into the List form is seeing some issue i guess. def f (arr:List[Int]) : List[Int] = { val list = new scala.collection.mutable.ListBuffer[Int](); val len = arr.length; for ( i <- 0 to len) { if(arr(i) < 0) { list.append((-1)*arr(i)) ; } else { list.append(arr(i)); } } return list.toList; } which is giving this error: java.lang.IndexOutOfBoundsException: 12 at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:52) at scala.collection.immutable.List.apply(List.scala:84) at Solution$.f(Solution.scala:7) at Solution$delayedInit$body.apply(Solution.scala:23) at scala.Function0$class.apply$mcV$sp(Function0.scala:40) at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12) at scala.App$$anonfun$main$1.apply(App.scala:71) at scala.App$$anonfun$main$1.apply(App.scala:7... Not getting what's wrong here.
The best way is to use Scala functions like #senia suggested in comments. For example: val res = list map math.abs But if you want to fix your code just replace to with until. You are getting off by one error: def f (arr:List[Int]) : List[Int] = { val list = new scala.collection.mutable.ListBuffer[Int](); val len = arr.length; for ( i <- 0 until len) { if(arr(i) < 0) { list.append((-1)*arr(i)) ; } else { list.append(arr(i)); } } return list.toList; } Here is the difference between until and to: 1 to 3 // Range(1, 2, 3) 1 until 3 // Range(1, 2) You can also remove return, ; and even braces { used with if/else.
Yet another version using a for comprehension that avoids indexing, def f (arr:List[Int]) : List[Int] = { val list = new scala.collection.mutable.ListBuffer[Int](); for { a <- arr sign = if (a < 0) -1 else 1 } list.append(sign * a) return list.toList; } As mentioned above, the return may be omitted.
You can try using case statements for more neat syntax : def f(arr:List[Int]):List[Int] = { val list = scala.collection.mutable.ListBuffer[Int]() arr.foreach{ x => x match { case _ if (x <0) => list+= (x*(-1)) case _ => list +=x } } list.toList }
Looks like you were trying to solve the challenge from here. Probably you may want to use more functional approach with recursion and immutable List. def f(arr: List[Int]): List[Int] = arr match { case Nil => Nil case x :: rest => java.lang.Math.abs(x) :: f(rest) }
Beginner friendly: this is how I wrote it def f(arr: List[Int]) : List[Int] = { var list = new scala.collection.mutable.ArrayBuffer[Int](); // var len = arr.length; for(i <-0 until arr.length) { list.append( math.abs(arr(i))); } return list.toList; } I haven't done any time complexity analysis but it's the most straightforward for beginners to understand. Also, it passes all the tests on hackerrank
def f (arr: List[Int]) : List[Int] = { arr.map { case i if 0 > i => i * -1 case i => i } }
How to find the largest element in a list of integers recursively?
I'm trying to write a function which will recursively find the largest element in a list of integers. I know how to do this in Java, but can't understand how to do this at Scala. Here is what I have so far, but without recursion: def max(xs: List[Int]): Int = { if (xs.isEmpty) throw new java.util.NoSuchElementException(); else xs.max; } How can we find it recursively with Scala semantic.
This is the most minimal recursive implementation of max I've ever been able to think up: def max(xs: List[Int]): Option[Int] = xs match { case Nil => None case List(x: Int) => Some(x) case x :: y :: rest => max( (if (x > y) x else y) :: rest ) } It works by comparing the first two elements on the list, discarding the smaller (or the first, if both are equal) and then calling itself on the remaining list. Eventually, this will reduce the list to one element which must be the largest. I return an Option to deal with the case of being given an empty list without throwing an exception - which forces the calling code to recognise the possibility and deal with it (up to the caller if they want to throw an exception). If you want it to be more generic, it should be written like this: def max[A <% Ordered[A]](xs: List[A]): Option[A] = xs match { case Nil => None case x :: Nil => Some(x) case x :: y :: rest => max( (if (x > y) x else y) :: rest ) } Which will work with any type which either extends the Ordered trait or for which there is an implicit conversion from A to Ordered[A] in scope. So by default it works for Int, BigInt, Char, String and so on, because scala.Predef defines conversions for them. We can become yet more generic like this: def max[A <% Ordered[A]](xs: Seq[A]): Option[A] = xs match { case s if s.isEmpty || !s.hasDefiniteSize => None case s if s.size == 1 => Some(s(0)) case s if s(0) <= s(1) => max(s drop 1) case s => max((s drop 1).updated(0, s(0))) } Which will work not just with lists but vectors and any other collection which extends the Seq trait. Note that I had to add a check to see if the sequence actually has a definite size - it might be an infinite stream, so we back away if that might be the case. If you are sure your stream will have a definite size, you can always force it before calling this function - it's going to work through the whole stream anyway. See notes at the end for why I really would not want to return None for an indefinite stream, though. I'm doing it here purely for simplicity. But this doesn't work for sets and maps. What to do? The next common supertype is Iterable, but that doesn't support updated or anything equivalent. Anything we construct might be very poorly performing for the actual type. So my clean no-helper-function recursion breaks down. We could change to using a helper function but there are plenty of examples in the other answers and I'm going to stick with a one-simple-function approach. So at this point, we can to switch to reduceLeft (and while we are at it, let's go for `Traversable' and cater for all collections): def max[A <% Ordered[A]](xs: Traversable[A]): Option[A] = { if (xs.hasDefiniteSize) xs reduceLeftOption({(b, a) => if (a >= b) a else b}) else None } but if you don't consider reduceLeft recursive, we can do this: def max[A <% Ordered[A]](xs: Traversable[A]): Option[A] = xs match { case i if i.isEmpty => None case i if i.size == 1 => Some(i.head) case i if (i collect { case x if x > i.head => x }).isEmpty => Some(i.head) case _ => max(xs collect { case x if x > xs.head => x }) } It uses the collect combinator to avoid some clumsy method of bodging a new Iterator out of xs.head and xs drop 2. Either of these will work safely with almost any collection of anything which has an order. Examples: scala> max(Map(1 -> "two", 3 -> "Nine", 8 -> "carrot")) res1: Option[(Int, String)] = Some((8,carrot)) scala> max("Supercalifragilisticexpialidocious") res2: Option[Char] = Some(x) I don't usually give these others as examples, because it requires more expert knowledge of Scala. Also, do remember that the basic Traversable trait provides a max method, so this is all just for practice ;) Note: I hope that all my examples show how careful choice of the sequence of your case expressions can make each individual case expression as simple as possible. More Important Note: Oh, also, while I am intensely comfortable returning None for an input of Nil, in practice I'd be strongly inclined to throw an exception for hasDefiniteSize == false. Firstly, a finite stream could have a definite or non-definite size dependent purely on the sequence of evaluation and this function would effectively randomly return Option in those cases - which could take a long time to track down. Secondly, I would want people to be able to differentiate between having passed Nil and having passed truly risk input (that is, an infinite stream). I only returned Option in these demonstrations to keep the code as simple as possible.
The easiest approach would be to use max function of TraversableOnce trait, as follows, val list = (1 to 10).toList list.max to guard against the emptiness you can do something like this, if(list.empty) None else Some(list.max) Above will give you an Option[Int] My second approach would be using foldLeft (list foldLeft None)((o, i) => o.fold(Some(i))(j => Some(Math.max(i, j)))) or if you know a default value to be returned in case of empty list, this will become more simpler. val default = 0 (list foldLeft default)(Math.max) Anyway since your requirement is to do it in recursive manner, I propose following, def recur(list:List[Int], i:Option[Int] = None):Option[Int] = list match { case Nil => i case x :: xs => recur(xs, i.fold(Some(x))(j => Some(Math.max(j, x)))) } or as default case, val default = 0 def recur(list:List[Int], i:Int = default):Int = list match { case Nil => i case x :: xs => recur(xs, i.fold(x)(j => Math.max(j, x))) } Note that, this is tail recursive. Therefore stack is also saved.
If you want functional approach to this problem then use reduceLeft: def max(xs: List[Int]) = { if (xs.isEmpty) throw new NoSuchElementException xs.reduceLeft((x, y) => if (x > y) x else y) } This function specific for list of ints, if you need more general approach then use Ordering typeclass: def max[A](xs: List[A])(implicit cmp: Ordering[A]): A = { if (xs.isEmpty) throw new NoSuchElementException xs.reduceLeft((x, y) => if (cmp.gteq(x, y)) x else y) } reduceLeft is a higher-order function, which takes a function of type (A, A) => A, it this case it takes two ints, compares them and returns the bigger one.
You could use pattern matching like that def max(xs: List[Int]): Int = xs match { case Nil => throw new NoSuchElementException("The list is empty") case x :: Nil => x case x :: tail => x.max(max(tail)) //x.max is Integer's class method }
Scala is a functional language whereby one is encourage to think recursively. My solution as below. I recur it base on your given method. def max(xs: List[Int]): Int = { if(xs.isEmpty == true) 0 else{ val maxVal= max(xs.tail) if(maxVal >= xs.head) maxVal else xs.head } } Updated my solution to tail recursive thanks to suggestions. def max(xs: List[Int]): Int = { def _max(xs: List[Int], maxNum: Int): Int = { if (xs.isEmpty) maxNum else { val max = { if (maxNum >= xs.head) maxNum else xs.head } _max(xs.tail, max) } } _max(xs.tail, xs.head) }
I used just head() and tail() def max(xs: List[Int]): Int = { if (xs.isEmpty) throw new NoSuchElementException else maxRecursive(xs.tail, xs.head) } def maxRecursive(xs: List[Int], largest: Int): Int = { if (!xs.isEmpty) { if (xs.head > largest) maxRecursive(xs.tail, xs.head) else maxRecursive(xs.tail, largest) } else { largest } } Here is tests for this logic: test("max of a few numbers") { assert(max(List(3, 7, 2, 1, 10)) === 10) assert(max(List(3, -7, 2, -1, -10)) === 3) assert(max(List(-3, -7, -2, -5, -10)) === -2) }
Folding can help: if(xs.isEmpty) throw new NoSuchElementException else (Int.MinValue /: xs)((max, value) => math.max(max, value)) List and pattern matching (updated, thanks to #x3ro) def max(xs:List[Int], defaultValue: =>Int):Int = { #tailrec def max0(xs:List[Int], maxSoFar:Int):Int = xs match { case Nil => maxSoFar case head::tail => max0(tail, math.max(maxSoFar, head)) } if(xs.isEmpty) defaultValue else max0(xs, Int.MinValue) } (This solution does not create Option instance every time. Also it is tail-recursive and will be as fast as an imperative solution.)
Looks like you're just starting out with scala so I try to give you the simplest answer to your answer, how do it recursively: def max(xs: List[Int]): Int = { def maxrec(currentMax : Int, l: List[Int]): Int = l match { case Nil => currentMax case head::tail => maxrec(head.max(currentMax), tail) //get max of head and curretn max } maxrec(xs.head, xs) } This method defines an own inner method (maxrec) to take care of the recursiveness. It will fail ( exception) it you give it an empty list ( there's no maximum on an empty List)
Here is my code (I am a newbie in functional programming) and I'm assuming whoever lands up under this question will be folks like me. The top answer, while great, is bit too much for newbies to take! So, here is my simple answer. Note that I was asked (as part of a Course) to do this using only head and tail. /** * This method returns the largest element in a list of integers. If the * list `xs` is empty it throws a `java.util.NoSuchElementException`. * * #param xs A list of natural numbers * #return The largest element in `xs` * #throws java.util.NoSuchElementException if `xs` is an empty list */ #throws(classOf[java.util.NoSuchElementException]) def max(xs: List[Int]): Int = find_max(xs.head, xs.tail) def find_max(max: Int, xs: List[Int]): Int = if (xs.isEmpty) max else if (max >= xs.head) find_max(max, xs.tail) else find_max(xs.head, xs.tail) Some tests: test("max of a few numbers") { assert(max(List(3, 7, 2)) === 7) intercept[NoSuchElementException] { max(List()) } assert(max(List(31,2,3,-31,1,2,-1,0,24,1,21,22)) === 31) assert(max(List(2,31,3,-31,1,2,-1,0,24,1,21,22)) === 31) assert(max(List(2,3,-31,1,2,-1,0,24,1,21,22,31)) === 31) assert(max(List(Int.MaxValue,2,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,222,3,-31,1,2,-1,0,24,1,21,22)) === Int.MaxValue) }
list.sortWith(_ > ).head & list.sortWith( > _).reverse.head for greatest and smallest number
If you are required to write a recursive max function on a list using isEmpty, head and tail and throw exception for empty list: def max(xs: List[Int]): Int = if (xs.isEmpty) throw new NoSuchElementException("max of empty list") else if (xs.tail.isEmpty) xs.head else if (xs.head > xs.tail.head) max(xs.head :: xs.tail.tail) else max(xs.tail) if you were to use max function on list it is simply (you don't need to write your own recursive function): val maxInt = List(1, 2, 3, 4).max
def max(xs: List[Int]): Int = { def _max(xs: List[Int], maxAcc:Int): Int = { if ( xs.isEmpty ) maxAcc else _max( xs.tail, Math.max( maxAcc, xs.head ) ) // tail call recursive } if ( xs.isEmpty ) throw new NoSuchElementException() else _max( xs, Int.MinValue ); }
With tail-recursion #tailrec def findMax(x: List[Int]):Int = x match { case a :: Nil => a case a :: b :: c => findMax( (if (a > b) a else b) ::c) }
With pattern matching to find max and return zero in case empty def findMax(list: List[Int]) = { def max(list: List[Int], n: Int) : Int = list match { case h :: t => max(t, if(h > n) h else n) case _ => n } max(list,0) }
I presume this is for the progfun-example This is the simplest recursive solution I could come up with def max(xs: List[Int]): Int = { if (xs.isEmpty) throw new NoSuchElementException("The list is empty") val tail = xs.tail if (!tail.isEmpty) maxOfTwo(xs.head, max(xs.tail)) else xs.head } def maxOfTwo(x: Int, y: Int): Int = { if (x >= y) x else y }
def max(xs: List[Int]): Int = xs match { case Nil => throw new NoSuchElementException("empty list!") case x :: Nil => x case x :: tail => if (x > max(tail)) x else max(tail) }