【问题标题】:How to return every nth even number in a list with foldLeft in Scala?如何在Scala中使用foldLeft返回列表中的第n个偶数?
【发布时间】:2020-03-17 11:12:08
【问题描述】:

对于一个大学项目,我必须实现一个名为 takeNthEven 的函数,它在 foldLeft 的帮助下找到列表中的第 n 个偶数。例如:

takeNthEven(SinglyLinkedIntList(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15,18,5,3), 3)

应该返回:SinglyLinkedIntList(4, 10,18)

到目前为止我的尝试:

def takeNthEven(input: IntList, n: Int): IntList = {
   var temp = SinglyLinkedIntList()

    input.foldLeft(0 -> 0) {
      case(acc,n) => if (acc == 2 || !(2 to (acc-1)).exists(x => i % x == 0)) temp.append(acc)
    }._n

  }

但不幸的是,这甚至无法编译。我不确定如何继续使用此算法,有人可以帮我解决这个问题吗?我是函数式编程的新手,不知道该怎么做

【问题讨论】:

  • 您能否提供更多输入和预期输出数据,并多解释一下您想要实现的目标?

标签: scala list data-structures primes foldleft


【解决方案1】:

这样的事情应该可以工作:

val (_, result) = input.foldLeft(0 -> List.empty[Int]) {
  case ((count, acc), elem) =>
    if ((elem % 2) == 0) {
      val newCount = count + 1
      if (newCount == n) {
        0 -> (elem :: acc)
      } else {
        newCount -> acc
      }
    } else {
      count -> acc
    }
}
result.reverse

【讨论】:

    【解决方案2】:

    这是我的看法。您可能需要根据IntList 的构成方式进行调整。

    type IntList = List[Int]
    
    def takeNthEven(input: IntList, n: Int): IntList = input.foldLeft(List.empty[Int]->1){
      case ((acc,cnt),elem) if elem%2 < 1 => if (cnt%n < 1) (elem::acc, cnt+1)
                                             else           (acc, cnt+1)
      case (skip,_) => skip
    }._1.reverse
    

    【讨论】:

      【解决方案3】:

      另一个向左折叠

      val n = 3
      val p = List(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15,18,5,3)
      
      p.foldLeft( (List.empty[Int],1) ) {
        case((x,y),z) =>  {
          val t = if(y%n==0 && z%2==0 ) z::x else x
          (t,if(z%2==0) y+1 else y)
        }
      }._1.reverse
      
      // List[Int] = List(4, 10, 18)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2017-03-04
        • 2012-04-05
        • 1970-01-01
        • 2013-06-12
        • 2016-01-16
        • 1970-01-01
        相关资源
        最近更新 更多