我正在尝试编写一个Scala函数,该函数将上限作为参数,并计算从1到此范围的数字的步数。它必须返回最大步数和需要许多步骤的相应数字。 (作为一对 - 第一个元素是步数,第二个是相应的索引)
我已经创建了一个名为“collatz”的函数来计算步数。我是Scala的新手,由于局限性,我有点卡住了。以下是我想要启动该功能的方法:
def max(x:Int):Int = {
for (i<-(1 to x).toList) yield collatz(i)
我认为解决这个问题的方法是:1。遍历范围并将collatz应用于所有元素,同时将它们放入存储步骤数的新列表中。 2.使用List.max查找新列表的最大值3.使用List.IndexOf查找索引。但是,我真的被困了,因为我不知道怎么做而不使用var(并且只使用val)。谢谢!
答案 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)
}