equal
  deleted
  inserted
  replaced
  
    
    
   211 foo(List(2,2,2,3))  | 
   211 foo(List(2,2,2,3))  | 
   212   | 
   212   | 
   213 // Tail recursion  | 
   213 // Tail recursion  | 
   214 //================  | 
   214 //================  | 
   215   | 
   215   | 
   216   | 
   216 def fact(n: BigInt): BigInt =   | 
   217 def fact(n: Long): Long =   | 
         | 
   218   if (n == 0) 1 else n * fact(n - 1)  | 
   217   if (n == 0) 1 else n * fact(n - 1)  | 
   219   | 
         | 
   220 def factB(n: BigInt): BigInt =   | 
         | 
   221   if (n == 0) 1 else n * factB(n - 1)  | 
         | 
   222   | 
         | 
   223 factB(100000)  | 
         | 
   224   | 
   218   | 
   225 fact(10)              //ok  | 
   219 fact(10)              //ok  | 
   226 fact(10000)           // produces a stackoverflow  | 
   220 fact(10000)           // produces a stackoverflow  | 
         | 
   221   | 
   227   | 
   222   | 
   228 def factT(n: BigInt, acc: BigInt): BigInt =  | 
   223 def factT(n: BigInt, acc: BigInt): BigInt =  | 
   229   if (n == 0) acc else factT(n - 1, n * acc)  | 
   224   if (n == 0) acc else factT(n - 1, n * acc)  | 
   230   | 
   225   | 
   231 factT(10, 1)  | 
   226 factT(10, 1)  | 
   244 // generates loop-like code, which does not need  | 
   239 // generates loop-like code, which does not need  | 
   245 // to allocate stack-space in each recursive  | 
   240 // to allocate stack-space in each recursive  | 
   246 // call; Scala can do this only for tail-recursive  | 
   241 // call; Scala can do this only for tail-recursive  | 
   247 // functions  | 
   242 // functions  | 
   248   | 
   243   | 
   249   | 
   244 def length(xs: List[Int]) : Int = xs match { | 
         | 
   245   case Nil => 0  | 
         | 
   246   case _ :: tail => 1 + length(tail)  | 
         | 
   247 }  | 
         | 
   248   | 
         | 
   249 @tailrec  | 
         | 
   250 def lengthT(xs: List[Int], acc : Int) : Int = xs match { | 
         | 
   251   case Nil => acc  | 
         | 
   252   case _ :: tail => lengthT(tail, 1 + acc)  | 
         | 
   253 }  | 
         | 
   254   | 
         | 
   255 lengthT(List.fill(10000000)(1), 0)  | 
   250   | 
   256   | 
   251   | 
   257   | 
   252 // Sudoku  | 
   258 // Sudoku  | 
   253 //========  | 
   259 //========  | 
   254   | 
   260   | 
   292   if (isDone(game)) List(game)  | 
   298   if (isDone(game)) List(game)  | 
   293   else   | 
   299   else   | 
   294     candidates(game, emptyPosition(game)).par.  | 
   300     candidates(game, emptyPosition(game)).par.  | 
   295       map(c => search(update(game, empty(game), c))).toList.flatten  | 
   301       map(c => search(update(game, empty(game), c))).toList.flatten  | 
   296 }  | 
   302 }  | 
         | 
   303   | 
   297   | 
   304   | 
   298 def search1T(games: List[String]): Option[String] = games match { | 
   305 def search1T(games: List[String]): Option[String] = games match { | 
   299   case Nil => None  | 
   306   case Nil => None  | 
   300   case game::rest => { | 
   307   case game::rest => { | 
   301     if (isDone(game)) Some(game)  | 
   308     if (isDone(game)) Some(game)  |