如何在 Scala 中使用 foldLeft return 列表中的每个第 n 个偶数?
How to return every nth even number in a list with foldLeft in Scala?
对于一个大学项目,我必须实现一个名为 takeNthEven 的函数,它在 foldLeft[=26= 的帮助下找到列表中的第 n 个偶数].例如:
takeNthEven(SinglyLinkedIntList(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15,18,5,3), 3)
应该return: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
}
但不幸的是,这甚至无法编译。我不确定如何继续使用此算法,有人可以帮我解决这个问题吗?我是函数式编程的新手,不知道该怎么做
像这样的东西应该可以工作:
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,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)
对于一个大学项目,我必须实现一个名为 takeNthEven 的函数,它在 foldLeft[=26= 的帮助下找到列表中的第 n 个偶数].例如:
takeNthEven(SinglyLinkedIntList(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15,18,5,3), 3)
应该return: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
}
但不幸的是,这甚至无法编译。我不确定如何继续使用此算法,有人可以帮我解决这个问题吗?我是函数式编程的新手,不知道该怎么做
像这样的东西应该可以工作:
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,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)