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) |