| 320 |      1 | object CW6a {
 | 
| 167 |      2 | 
 | 
| 320 |      3 | //(1) Complete the collatz function below. It should
 | 
|  |      4 | //    recursively calculate the number of steps needed 
 | 
|  |      5 | //    until the collatz series reaches the number 1.
 | 
|  |      6 | //    If needed, you can use an auxiliary function that
 | 
|  |      7 | //    performs the recursion. The function should expect
 | 
|  |      8 | //    arguments in the range of 1 to 1 Million.
 | 
| 323 |      9 | def stepsCounter(n: Long, s: Long) : Long = n match{
 | 
|  |     10 |     case 1 => s
 | 
|  |     11 |     case n if(n%2==0) => stepsCounter(n/2,s+1)
 | 
|  |     12 |     case _ => stepsCounter(3*n+1, s+1)
 | 
|  |     13 | }
 | 
|  |     14 | 
 | 
|  |     15 | def collatz(n: Long) : Long = n match {
 | 
|  |     16 |     case n if(n>0) => stepsCounter(n,0)
 | 
|  |     17 |     case n if(n<=0) => stepsCounter(1,0)
 | 
|  |     18 | }
 | 
| 281 |     19 | 
 | 
| 126 |     20 | 
 | 
| 320 |     21 | 
 | 
|  |     22 | //(2) Complete the collatz_max function below. It should
 | 
|  |     23 | //    calculate how many steps are needed for each number 
 | 
|  |     24 | //    from 1 up to a bound and then calculate the maximum number of
 | 
|  |     25 | //    steps and the corresponding number that needs that many 
 | 
|  |     26 | //    steps. Again, you should expect bounds in the range of 1
 | 
|  |     27 | //    up to 1 Million. The first component of the pair is
 | 
|  |     28 | //    the maximum number of steps and the second is the 
 | 
|  |     29 | //    corresponding number.
 | 
|  |     30 | 
 | 
| 323 |     31 | def collatz_max(bnd: Long) : (Long, Long) =  {
 | 
|  |     32 |     val allCollatz = for(i<-1L until bnd) yield collatz(i)
 | 
|  |     33 |     val pair = (allCollatz.max, (allCollatz.indexOf(allCollatz.max) +1).toLong)
 | 
|  |     34 |     pair
 | 
| 126 |     35 | }
 | 
|  |     36 | 
 | 
| 127 |     37 | }
 |