【问题标题】:Collatz - maximum number of steps and the corresponding numberCollat​​z - 最大步数和对应的步数
【发布时间】:2017-11-14 05:31:17
【问题描述】:

我正在尝试编写一个 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)的情况下做到这一点。谢谢!

【问题讨论】:

    标签: scala list max collatz


    【解决方案1】:

    类似这样的:

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

    【讨论】:

    • 我还没有涵盖你灵魂中的一些东西,所以我试图通过只使用 for loop、.toList、List.max 和 indexOf 来获得它。我可以告诉你我是如何解决第一部分的(collat​​z 函数)
    • code def collat​​z(n: Long): Long = { val count=1 if (n==1) { count } else if (n%2==1) { val count2= collat​​z(n*3+1)+1 count2 } else { val count3=collat​​z(n/2) +1 count3 } } code
    • 我使用for 循环添加了解决方案
    • 我也不能使用 sortBy,你能告诉我为什么我的代码不起作用吗? (尽管效率低下)我只需要使用最基本的语法
    • code def maximum(x:Long):Long = { for (icode
    【解决方案2】:

    试试:

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

    【讨论】:

    • code def maximum(x:Long):Long = { for (icode 为什么这不起作用? scala 中的 return 究竟是如何处理的?
    • @JamesT 对于初学者,该代码无法编译。 collatz(i).toList 应该做什么? collatz 函数不返回 Int 吗? collatz 的类型是什么?我们需要查看可编译代码或编译错误。
    猜你喜欢
    • 2022-12-10
    • 2021-12-14
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多