Collat​​z - 最大步数和相应的数字

时间:2017-11-13 20:41:30

标签: scala list max collatz

我正在尝试编写一个Scala函数,该函数将上限作为参数,并计算从1到此范围的数字的步数。它必须返回最大步数和需要许多步骤的相应数字。 (作为一对 - 第一个元素是步数,第二个是相应的索引)

我已经创建了一个名为“collat​​z”的函数来计算步数。我是Scala的新手,由于局限性,我有点卡住了。以下是我想要启动该功能的方法:

def max(x:Int):Int = {
  for (i<-(1 to x).toList) yield collatz(i) 

我认为解决这个问题的方法是:1。遍历范围并将collat​​z应用于所有元素,同时将它们放入存储步骤数的新列表中。 2.使用List.max查找新列表的最大值3.使用List.IndexOf查找索引。但是,我真的被困了,因为我不知道怎么做而不使用var(并且只使用val)。谢谢!

2 个答案:

答案 0 :(得分:0)

尝试:

(1 to x).map(collatz).maxBy(_._2)._1

答案 1 :(得分:0)

这样的事情:

def collatzMax(n: Long): (Long, Long) = {
  require(n > 0, "Collatz function is not defined for n <= 0")

  def collatz(n: Long, steps: Long): Long = n match {
    case n if (n <= 1)     => steps
    case n if (n % 2 == 0) => collatz(n / 2, steps + 1)
    case n if (n % 2 == 1) => collatz(3 * n + 1, steps + 1)
  }

  def loop(n: Long, current: Long, acc: List[(Long, Long)]): List[(Long, Long)] = 
    if (current > n) acc
    else {
      loop(n, current + 1, collatz(current, 0) -> current :: acc)
    }

  loop(n, 1, Nil).sortBy(-_._1).head
}

示例:

collatzMax(12)
result: (Long, Long) = (19,9) // 19 steps for collatz(9)

用于:

def collatzMax(n: Long) = 
  (for(i <- 1L to n) yield collatz(i) -> i).sortBy(-_._1).head

或(继续你的想法):

def maximum(x: Long): (Long, Long) = {
  val lst = for (i <- 1L to x) yield collatz(i) 
  val maxValue = lst.max
  (maxValue, lst.indexOf(maxValue) + 1)
}