scala/recs.scala
changeset 194 fc2a5e9fbb97
parent 193 317a2532c567
child 195 f06aa4e1c25b
equal deleted inserted replaced
193:317a2532c567 194:fc2a5e9fbb97
     1 package object recs {
     1 package object recs {
     2 
     2 
       
     3 //Recursive Functions
     3 
     4 
     4 //Recursive Functions
       
     5 abstract class Rec {
     5 abstract class Rec {
     6   def eval(ns: List[Int]) : Int
     6   def eval(ns: List[Int]) : Int
     7 }
     7 }
       
     8 
     8 case object Z extends Rec {
     9 case object Z extends Rec {
     9   override def eval(ns: List[Int]) = ns match {
    10   override def eval(ns: List[Int]) = ns match {
    10     case n::Nil => 0
    11     case n::Nil => 0
    11     case _ => throw new IllegalArgumentException("Z: args")
    12     case _ => throw new IllegalArgumentException("Z: args")
    12   }
    13   }
    13 } 
    14 } 
       
    15 
    14 case object S extends Rec {
    16 case object S extends Rec {
    15   override def eval(ns: List[Int]) = ns match {
    17   override def eval(ns: List[Int]) = ns match {
    16     case n::Nil => n + 1
    18     case n::Nil => n + 1
    17     case _ => throw new IllegalArgumentException("S: args")
    19     case _ => throw new IllegalArgumentException("S: args")
    18   }
    20   }
    19 } 
    21 } 
       
    22 
    20 case class Id(n: Int, m: Int) extends Rec {
    23 case class Id(n: Int, m: Int) extends Rec {
    21   override def eval(ns: List[Int]) = 
    24   override def eval(ns: List[Int]) = 
    22     if (ns.length == n && m < n) ns(m)
    25     if (ns.length == n && m < n) ns(m)
    23     else throw new IllegalArgumentException("Id: args")
    26     else throw new IllegalArgumentException("Id: args")
    24 }
    27 }
       
    28 
    25 case class Cn(n: Int, f: Rec, gs: List[Rec]) extends Rec {
    29 case class Cn(n: Int, f: Rec, gs: List[Rec]) extends Rec {
    26   override def eval(ns: List[Int]) = 
    30   override def eval(ns: List[Int]) = 
    27     if (ns.length == n) f.eval(gs.map(_.eval(ns)))
    31     if (ns.length == n) f.eval(gs.map(_.eval(ns)))
    28     else throw new IllegalArgumentException("Cn: args")
    32     else throw new IllegalArgumentException("Cn: args")
    29 }
    33 }
       
    34 
    30 case class Pr(n: Int, f: Rec, g: Rec) extends Rec {
    35 case class Pr(n: Int, f: Rec, g: Rec) extends Rec {
    31   override def eval(ns: List[Int]) = 
    36   override def eval(ns: List[Int]) = 
    32     if (ns.length == n - 1) {
    37     if (ns.length == n - 1) {
    33       if (ns.last == 0) f.eval(ns.init)
    38       if (ns.last == 0) f.eval(ns.init)
    34       else {
    39       else {
    36         g.eval(ns.init ::: List(ns.last - 1, r))
    41         g.eval(ns.init ::: List(ns.last - 1, r))
    37       }
    42       }
    38     }
    43     }
    39     else throw new IllegalArgumentException("Cn: args")
    44     else throw new IllegalArgumentException("Cn: args")
    40 }
    45 }
       
    46 
    41 case class Mn(n: Int, f: Rec) extends Rec {
    47 case class Mn(n: Int, f: Rec) extends Rec {
    42   override def eval(ns: List[Int]) = 0
    48   override def eval(ns: List[Int]) = 0
    43     
    49     
    44 }
    50 }
    45 
    51