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