Scala algorithm: Compute nth row of Pascal's triangle
Published
Algorithm goal
In a Pascal's triangle, a number in a row is created by adding the two numbers directly above it; the first row is contains only 1, and the second row contains 1 and another 1.
This is a Pascal's triangle to its 5th row:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
The goal is to compute the nth row of the triangle.
Test cases in Scala
assert(nextRow(List(1, 1)) == List(1, 2, 1))
assert(pascalsTriangle(0) == List(1))
assert(pascalsTriangle(1) == List(1, 1))
assert(pascalsTriangle(2) == List(1, 2, 1))
assert(pascalsTriangle(3) == List(1, 3, 3, 1))
assert(pascalsTriangle(4) == List(1, 4, 6, 4, 1))
Algorithm in Scala
8 lines of Scala (compatible versions 2.13 & 3.0), showing how concise Scala can be!
Get the full algorithm !
or
'Unlimited Scala Algorithms' gives you access to all the 100 published Scala Algorithms!
Upon purchase, you will be able to Register an account to access all the algorithms on multiple devices.
Explanation
Breaking down the problem to its constituent part, we need to compute the next row from a previous row. Noticing the fact that the next row's items are really a sum of pairs of previous row's items, combined with previous row's items slightly shifted, notice that to go from row [1,2,1], we produce a new row which is [1, 2 + 1, 1 + 2, 1], which is [0 + 1, 1 + 2, 2 + 1, 1 + 0], which is [0, 1, 2, 1] + [ 1, 2, 1, 0 ].
Effectively, we just need to sum the original row with the original row slightly shifted (0 added). (this is © from www.scala-algorithms.com)
Full explanation is available to subscribers
Scala concepts & Hints
Lazy List
The 'LazyList' type (previously known as 'Stream' in Scala) is used to describe a potentially infinite list that evaluates only when necessary ('lazily').
Pattern Matching
Pattern matching in Scala lets you quickly identify what you are looking for in a data, and also extract it.
Zip
'zip' allows you to combine two lists pair-wise (meaning turn a pair of lists, into a list of pairs)
It can be used over Arrays, Lists, Views, Iterators and other collections.