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 |