Counting valleys traversed below sea level, given elevation changes Problem Statement:


  Gary is an avid hiker. He tracks his hikes meticulously, paying close
  attention to small details like topography. During his last hike he
  took exactly steps. For every step he took, he noted if it was an
  uphill, or a downhill,  step. Gary's hikes start and end at sea
  level and each step up or down represents a  unit change in altitude.
  We define the following terms:
  
  A mountain is a sequence of consecutive steps above sea level,
  starting with a step up from sea level and ending with a step down to
  sea level. A valley is a sequence of consecutive steps below sea
  level, starting with a step down from sea level and ending with a step
  up to sea level. Given Gary's sequence of up and down steps during his
  last hike, find and print the number of valleys he walked through.
  
  For example, if Gary's path is, he first enters a valley units deep.
  Then he climbs out an up onto a mountain units high. Finally, he
  returns to sea level and ends his hike.
  
  Function Description
  
  Complete the countingValleys function in the editor below. It must
  return an integer that denotes the number of valleys Gary traversed.
  
  countingValleys has the following parameter(s):
  
  
  n: the number of steps Gary takes
  s: a string describing his path
  
  
  Input Format
  
  The first line contains an integer, the number of steps in Gary's
  hike.  The second line contains a single string, of characters that
  describe his path.
  
  Output Format
  
  Print a single integer that denotes the number of
  valleys Gary walked through during his hike.


My solution goes like this : 

def countingValleys(n: Int, s: String): Int = {
  def rec(path: List[Char], counter: Int, valleys: Int): Int = {
    path match  {
      case Nil =&gt; valleys
      case x::xs if (x == 'U') &amp;&amp; ((counter + 1) == 0) =&gt;
        rec(xs, counter+1, valleys+1 )
      case x::xs if x == 'U' =&gt; rec(xs, counter +1, valleys)
      case x::xs if x == 'D' =&gt; rec(xs, counter -1, valleys)
    }
  }
  rec(s.toList, 0, 0)
}


Sample Input: 

8
UDDDUDUU


Sample Output:

1


I wonder if there is a more idiomatic solution in functional programming style.
There's nothing wrong with or "not functional" about your approach. This might be opinion territory, but personally I would consider using foldLeft as it might be more readable and you can potentially eliminate some of the complexity of your cases.

(also I got rid of n here as it is completely irrelevant, I know it's a problem from a website so you have to follow the format they gave you)

def countingValleys (steps: String): Int = steps
  .foldLeft((0, 0)) {
    case ((valleys, elevation), 'D') =&gt; (valleys, elevation - 1)
    case ((valleys, -1), 'U') =&gt; (valleys + 1, 0)
    case ((valleys, elevation), _) =&gt; (valleys, elevation + 1)
  }
  ._1