78
|
1 |
// Part 2 about Regular Expression Matching
|
68
|
2 |
//==========================================
|
4
|
3 |
|
78
|
4 |
// copy over all code from re.scala
|
|
5 |
|
|
6 |
// (2a) Complete the function iterT which needs to
|
|
7 |
// be tail-recursive(!) and takes an integer n, a
|
|
8 |
// function f and an x as arguments. This function
|
|
9 |
// should iterate f n-times starting with the
|
|
10 |
// argument x.
|
|
11 |
|
|
12 |
import scala.annotation.tailrec
|
|
13 |
|
|
14 |
@tailrec
|
|
15 |
def iterT[A](n: Int, f: A => A, x: A): A = ...
|
68
|
16 |
|
|
17 |
|
|
18 |
|
78
|
19 |
// (2b) Complete the size function for regular
|
|
20 |
// expressions
|
4
|
21 |
|
78
|
22 |
def size(r: Rexp): Int = ...
|
4
|
23 |
|
78
|
24 |
// two testcases about the sizes of simplified and
|
|
25 |
// un-simplified derivatives
|
68
|
26 |
|
78
|
27 |
//val EVIL = SEQ(STAR(STAR(CHAR('a'))), CHAR('b'))
|
|
28 |
//size(iterT(20, (r: Rexp) => der('a', r), EVIL)) // should produce 7340068
|
|
29 |
//size(iterT(20, (r: Rexp) => simp(der('a', r)), EVIL)) // should produce 8
|
4
|
30 |
|
68
|
31 |
|
4
|
32 |
|
78
|
33 |
// (2c) Complete the fixpoint function below.
|
|
34 |
|
|
35 |
@tailrec
|
|
36 |
def fixpT[A](f: A => A, x: A): A = ...
|
4
|
37 |
|
|
38 |
|
78
|
39 |
/* testcases
|
|
40 |
|
|
41 |
//the Collatz function from CW 6 defined as fixpoint
|
|
42 |
|
|
43 |
def ctest(n: Long): Long =
|
|
44 |
if (n == 1) 1 else
|
|
45 |
if (n % 2 == 0) n / 2 else 3 * n + 1
|
|
46 |
|
|
47 |
// should all produce 1
|
|
48 |
fixpT(ctest, 97L)
|
|
49 |
fixpT(ctest, 871L)
|
|
50 |
fixpT(ctest, 77031L)
|
|
51 |
|
|
52 |
*/
|
|
53 |
|
|
54 |
/*
|
|
55 |
// the same function on strings using the regular expression
|
|
56 |
// matcher
|
|
57 |
|
|
58 |
def foo(s: String): String = {
|
|
59 |
if (matcher("a", s)) "a" else
|
|
60 |
if (matcher("aa" ~ STAR("aa"), s)) s.take(s.length / 2)
|
|
61 |
else "a" ++ s * 3
|
4
|
62 |
}
|
|
63 |
|
78
|
64 |
// should all produce "a"
|
|
65 |
fixpT(foo, "a" * 97)
|
|
66 |
fixpT(foo, "a" * 871)
|
|
67 |
|
68
|
68 |
*/
|