progs/lecture3.scala
changeset 494 253d1ccb65de
parent 493 244df77507c2
equal deleted inserted replaced
493:244df77507c2 494:253d1ccb65de
     7 
     7 
     8 // - recursion
     8 // - recursion
     9 // - Sudoku
     9 // - Sudoku
    10 // - string interpolations
    10 // - string interpolations
    11 // - Pattern-Matching
    11 // - Pattern-Matching
       
    12 
       
    13 def fact(n: BigInt) : BigInt = {
       
    14   if (n == 0) 1 
       
    15   else n * fact(n - 1)
       
    16 }
       
    17 
       
    18 def fib(n: BigInt) : BigInt = {
       
    19   if (n == 0) 1
       
    20   else if (n == 1) 1 
       
    21   else fib(n - 1) + fib(n - 2)
       
    22 }
       
    23 
       
    24 
       
    25 
       
    26 
       
    27 
       
    28 def inc(n: Int) : Int = n + 1
       
    29 
       
    30 for (n <- List(1,2,3,4)) yield inc(n)
       
    31 
       
    32 List().map(inc)
       
    33 
       
    34 
       
    35 
       
    36 my_map(inc, List(1,2,3,4))
       
    37 
       
    38 
       
    39 
       
    40 
       
    41 
    12 
    42 
    13 // A Recursive Web Crawler / Email Harvester
    43 // A Recursive Web Crawler / Email Harvester
    14 //===========================================
    44 //===========================================
    15 //
    45 //
    16 // the idea is to look for links using the
    46 // the idea is to look for links using the
    77 
   107 
    78 // THE POINT OF THIS CODE IS NOT TO BE SUPER
   108 // THE POINT OF THIS CODE IS NOT TO BE SUPER
    79 // EFFICIENT AND FAST, just explaining exhaustive
   109 // EFFICIENT AND FAST, just explaining exhaustive
    80 // depth-first search
   110 // depth-first search
    81 
   111 
       
   112 //> using dep org.scala-lang.modules::scala-parallel-collections:1.0.4
       
   113 import scala.collection.parallel.CollectionConverters.*
       
   114 
       
   115 
       
   116 val s1 = "s\n"
       
   117 val s2 = """s\n"""
    82 
   118 
    83 val game0 = """.14.6.3..
   119 val game0 = """.14.6.3..
    84               |62...4..9
   120               |62...4..9
    85               |.8..5.6..
   121               |.8..5.6..
    86               |.6.2....3
   122               |.6.2....3
   284 //       case pattern2 => expression2
   320 //       case pattern2 => expression2
   285 //       ...
   321 //       ...
   286 //       case patternN => expressionN
   322 //       case patternN => expressionN
   287 //    }
   323 //    }
   288 
   324 
       
   325 def my_map(f: Int => Int, xs: List[Int]) : List[Int] =  
       
   326   xs match {
       
   327     case Nil => Nil 
       
   328     case hd::tl => f(hd) ::  my_map(f, tl)
       
   329   }
       
   330 
       
   331 my_map(x => x * x, List(1,2,3,4))
       
   332 
   289 
   333 
   290 // recall
   334 // recall
   291 def len(xs: List[Int]) : Int = {
   335 def len(xs: List[Int]) : Int = {
   292     if (xs == Nil) 0
   336     if (xs == Nil) 0
   293     else 1 + len(xs.tail)
   337     else 1 + len(xs.tail)
   348  println(fizz_buzz(n))
   392  println(fizz_buzz(n))
   349 
   393 
   350 // more interesting patterns for lists - calculate the deltas between 
   394 // more interesting patterns for lists - calculate the deltas between 
   351 // elements
   395 // elements
   352 
   396 
       
   397 List(4,3,2,1) -> List(1,1,.. )
       
   398 
   353 def delta(xs: List[Int]) : List[Int] = xs match {
   399 def delta(xs: List[Int]) : List[Int] = xs match {
   354   case Nil => Nil
   400   case Nil => Nil
   355   case x::Nil => x::Nil
   401   case x::Nil => x::Nil
   356   case x::y::xs => (x - y)::delta(y::xs)
   402   case x::y::xs => (x - y)::delta(y::xs)
   357 }
   403 }
   383 case class Leaf(x: Int) extends Tree
   429 case class Leaf(x: Int) extends Tree
   384 case class Node(s: String, left: Tree, right: Tree) extends Tree 
   430 case class Node(s: String, left: Tree, right: Tree) extends Tree 
   385 
   431 
   386 val lf = Leaf(20)
   432 val lf = Leaf(20)
   387 val tr = Node("foo", Leaf(10), Leaf(23))
   433 val tr = Node("foo", Leaf(10), Leaf(23))
       
   434 
       
   435 def sizet(t: Tree) : Int = t match {
       
   436   case Leaf(_) => 1
       
   437   case Node(_, left , right) => 1 + sizet(left) + sizet(right)
       
   438 }
       
   439 
       
   440 sizet(tr)
   388 
   441 
   389 val lst : List[Tree] = List(lf, tr)
   442 val lst : List[Tree] = List(lf, tr)
   390 
   443 
   391 
   444 
   392 abstract class Colour
   445 abstract class Colour