如何在Scala中使用foldLeft返回列表中的第n个偶数?

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

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

应返回:SinglyLinkedIntList(4,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

  }

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

xiaoyuan523 回答:如何在Scala中使用foldLeft返回列表中的第n个偶数?

类似的事情应该起作用:

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
,

这是我的看法。您可能必须根据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
,

另一折左

val n = 3
val p = List(0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15,18,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,18)
本文链接:https://www.f2er.com/3057689.html

大家都在问