updated
authorChristian Urban <urbanc@in.tum.de>
Sun, 05 Nov 2017 12:56:55 +0000
changeset 126 c40f364d87eb
parent 125 dcaab8068baa
child 127 b4def82f3f9f
updated
testing/collatz.scala
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/testing/collatz.scala	Sun Nov 05 12:56:55 2017 +0000
@@ -0,0 +1,47 @@
+// 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 1 Million.
+
+
+def collatz(n: Long): Int =
+  if (n == 1) 1 else
+    if (n % 2 == 0) (1 + collatz(n / 2)) else 
+      (1 + collatz(3 * n + 1))
+
+
+//(2)  Complete the collatz bound function below. It should
+//     calculuate how many steps are needed for each number 
+//     from 1 upto a bound and then produce the maximum number of
+//     steps and the corresponding number that needs that many 
+//     steps. You should expect bounds in the range of 1
+//     upto 1 million. 
+
+def collatz_max(bnd: Int): (Int, Int) = {
+  val all = for (i <- (1 to bnd).toList) yield collatz(i)
+  val max = all.max
+  (all.indexOf(max) + 1, max)
+}
+
+
+// some testing harness
+/*
+val bnds = List(2, 10, 100, 1000, 10000, 100000, 77000, 90000, 1000000, 5000000)
+
+for (bnd <- bnds) {
+  val (max, steps) = collatz_max(bnd)
+  println(s"In the range of 1 - ${bnd} the number ${max} needs the maximum steps of ${steps}")
+}
+*/
+
+//val all = for (i <- (1 to 100000).toList) yield collatz1(i)
+//println(all.sorted.reverse.take(10))
+
+
+