# HG changeset patch # User Christian Urban # Date 1478601438 0 # Node ID ecf83084e41dc3b3e541b7f049ca986a35f63010 # Parent 714e60f22b17baa600b74599c73fbca4775215ca updated diff -r 714e60f22b17 -r ecf83084e41d progs/collatz_sol.scala --- a/progs/collatz_sol.scala Tue Nov 08 10:31:04 2016 +0000 +++ b/progs/collatz_sol.scala Tue Nov 08 10:37:18 2016 +0000 @@ -1,12 +1,17 @@ // Part 1 about the 3n+1 conceture //================================= +//(1) Complete the collatz function below. It should +// recursively calculate the number of steps needed +// until the collatz series reaches the number 1. +// If needed you can use an auxilary function that +// performs the recursion. The function should expect +// arguments in the range of 1 to 10 Million. -//(1) Complete the collatz function below. It should -//recursively calculates the number of steps needed -//number until a series ends with 1 - -def collatz(n: Long): List[Long] = ... +def collatz(n: Long): List[Long] = + if (n == 1) List(1) else + if (n % 2 == 0) (n::collatz(n / 2)) else + (n::collatz(3 * n + 1)) // an alternative that calculates the steps directly @@ -16,12 +21,18 @@ (1 + collatz1(3 * n + 1)) -//(2) +//(2) Complete the collatz bound function below. It should +// calculuate how many steps are needed for each number +// from 1 upto a bound and return the maximum number of +// steps. You should expect bounds in the range of 1 +// upto 10 million. + def collatz_max(bnd: Int): Int = { (for (i <- 1 to bnd) yield collatz(i).length).max } +// some testing harness val bnds = List(10, 100, 1000, 10000, 100000, 1000000, 10000000) for (bnd <- bnds) {