progs/re2_sol.scala
changeset 107 b3fa3de85e75
parent 101 2acb1d25fe91
equal deleted inserted replaced
106:f4cd56d9cd4f 107:b3fa3de85e75
   155   if (n == 0) x else iterT(n - 1, f, f(x)) 
   155   if (n == 0) x else iterT(n - 1, f, f(x)) 
   156 
   156 
   157 
   157 
   158 //non-tail recursive iter
   158 //non-tail recursive iter
   159 
   159 
   160 def iter[A](n: Int, f: A => A, x: A): A = 
   160 //def iter[A](n: Int, f: A => A)(x: A): A = 
   161   if (n == 0) x else f(iter(n - 1,f, x)) 
   161 //  if (n == 0) x else f(iter(n - 1,f, x)) 
   162 
   162 
   163 
   163 
   164 iter(200000, (x: Int) => x + 1, 0)
       
   165 iterT(200000, (x: Int) => x + 1, 0)
       
   166 iterT(100, (x: Int) => x * 2, 2)
       
   167 iterT(100, (x: BigInt) => x * 2, BigInt(2))
       
   168 iterT(10, (x: String) => x ++ "a", "a")
       
   169 
   164 
   170 // (2b)
   165 // (2b)
   171 
   166 
   172 def size(r: Rexp): Int = r match {
   167 def size(r: Rexp): Int = r match {
   173   case ZERO => 1
   168   case ZERO => 1
   190 def fixpT[A](f: A => A, x: A): A = {
   185 def fixpT[A](f: A => A, x: A): A = {
   191   val fx = f(x)
   186   val fx = f(x)
   192   if (fx == x) x else fixpT(f, fx) 
   187   if (fx == x) x else fixpT(f, fx) 
   193 }
   188 }
   194 
   189 
   195 fixpT((x:Int) => if (200000 < x) x else x + 1, 0)
       
   196 
       
   197 def ctest(n: Long): Long =
   190 def ctest(n: Long): Long =
   198   if (n == 1) 1 else
   191   if (n == 1) 1 else
   199     if (n % 2 == 0) n / 2 else 3 * n + 1
   192     if (n % 2 == 0) n / 2 else 3 * n + 1
   200 
   193 
   201 fixpT(ctest, 97L)
   194 fixpT(ctest, 97L)