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.

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)

The rest of the Explanation is available for subscribers.

or

'Unlimited Scala Algorithms' gives you access to all the Scala Algorithms!

Upon purchase, you will be able to Register an account to access all the algorithms on multiple devices.

Scala concepts & Hints

  1. 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').

  2. Pattern Matching

    Pattern matching in Scala lets you quickly identify what you are looking for in a data, and also extract it.

    assert("Hello World".collect {
      case character if Character.isUpperCase(character) => character.toLower
    } == "hw")
    
  3. 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.

    assert(List(1, 2, 3).zip(List(5, 6, 7)) == List(1 -> 5, 2 -> 6, 3 -> 7))
    
    assert(List(1, 2).zip(List(5, 6, 7)) == List(1 -> 5, 2 -> 6))
    
    assert(List(5, 6).zipWithIndex == List(5 -> 0, 6 -> 1))
    
    assert(List(5, 6).zipAll(List('A'), 9, 'Z') == List(5 -> 'A', 6 -> 'Z'))
    
    assert(List(5).zipAll(List('A', 'B'), 1, 'Z') == List(5 -> 'A', 1 -> 'B'))
    

Algorithm in Scala

10 lines of Scala (version 2.13), showing how concise Scala can be!

This solution is available for access!

or

'Unlimited Scala Algorithms' gives you access to all the Scala Algorithms!

Upon purchase, you will be able to Register an account to access all the algorithms on multiple devices.

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))

View the rest of Scala algorithms