Wikipedia

Search results

27 September 2013

Writing Pascal Triangle in Scala

The Pascal Triangle has some basic ground rules, all based on it's final/original structure:


1                        The first column/row is 1
11                      Where column = row is 1
121                    The inside variables are a sum of the above row (row - 1), and neighbor to it's left (row - 1, column - 1)
1331
14641

Granted we are dealing with integers, we can formulate the above logic with a little Scala as:

def pascalLogic(r:Int, c:Int) =
  // if first column/row or column = row
  if (c == 0 || r == c) 1
  // else sum of values
  else pascalLogic(r-1, c) + pascalLogic(r-1, c+1)

To print out the pretty Pascal Triangle sans spaces, print the integer result for each message, and create line breaks at all instances where (r == c):

for (r <- 0 to c by 1) {
  for (c <- 0 to r by 1)
      print(pascalLogic(r, c) + " ")
    println()
  }    

Combining the pieces :

   def drawPascalTriangle(c:Int) { // curly brace creates closure/block/scope
      for (r <- 0 to c by 1) {
        for (c <- 0 to r by 1)
          print(pascalLogic(r, c) + " ")
        println()

     def pascalLogic(r:Int, c:Int):Int =
       if (c == 0 || r == c) 1
       else pascalLogic(r-1, c) + pascalLogic(r-1, c-1)
       }
     }

drawPascalTriangle(12)

COMMON RECURSIVE PATTERNS

- Linear (eg factorial)
- Tree (eg Fibonacci, counting change)
- Primes and GCD

// factorial
def fac(x:Int, acc:Int):Int =
  if (x == 0) 1
  else if (x == 1) acc
  else fac(x-1, acc * x)

// fibonacci
def fibo(n:Int):Int =
  if (n==0) 0
  else if (n==1) 1
  else fibo(n-1) + fibo(n-2)

// counting change
def countChange(money:Int, coins:List[Int]):Int =
  if (money == 0) 1 else if (money < 0 || coins.isEmpty) 0 else {
    countChange(money - coins.head, coins) + countChange(money, coins.tail)
    }