典型嵌套 while 循环的功能版本
Functional version of a typical nested while loop
希望这个问题能取悦函数式编程爱好者。我能否寻求一种方法将以下代码片段转换为 Scala 中的纯函数实现,并在可读性和执行速度之间取得良好的平衡?
描述:对于序列中的每个元素,产生一个子序列,其中包含当前元素(包括自身)之后距离小于给定阈值的元素。一旦超过阈值,就不需要处理剩余的元素
def getGroupsOfElements(input : Seq[Element]) : Seq[Seq[Element]] = {
val maxDistance = 10 // put any number you may
var outerSequence = Seq.empty[Seq[Element]]
for (index <- 0 until input.length) {
var anotherIndex = index + 1
var distance = input(index) - input(anotherIndex) // let assume a separate function for computing the distance
var innerSequence = Seq(input(index))
while (distance < maxDistance && anotherIndex < (input.length - 1)) {
innerSequence = innerSequence ++ Seq(input(anotherIndex))
anotherIndex = anotherIndex + 1
distance = input(index) - input(anotherIndex)
}
outerSequence = outerSequence ++ Seq(innerSequence)
}
outerSequence
}
您知道,如果您在代码中添加了对您要完成的目标的描述,这会容易得多。
无论如何,这里有一些可能接近您想要的东西。
def getGroupsOfElements(input: Seq[Element]): Seq[Seq[Element]] =
input.tails.map(x => x.takeWhile(y => distance(x.head,y) < maxDistance)).toSeq
希望这个问题能取悦函数式编程爱好者。我能否寻求一种方法将以下代码片段转换为 Scala 中的纯函数实现,并在可读性和执行速度之间取得良好的平衡?
描述:对于序列中的每个元素,产生一个子序列,其中包含当前元素(包括自身)之后距离小于给定阈值的元素。一旦超过阈值,就不需要处理剩余的元素
def getGroupsOfElements(input : Seq[Element]) : Seq[Seq[Element]] = {
val maxDistance = 10 // put any number you may
var outerSequence = Seq.empty[Seq[Element]]
for (index <- 0 until input.length) {
var anotherIndex = index + 1
var distance = input(index) - input(anotherIndex) // let assume a separate function for computing the distance
var innerSequence = Seq(input(index))
while (distance < maxDistance && anotherIndex < (input.length - 1)) {
innerSequence = innerSequence ++ Seq(input(anotherIndex))
anotherIndex = anotherIndex + 1
distance = input(index) - input(anotherIndex)
}
outerSequence = outerSequence ++ Seq(innerSequence)
}
outerSequence
}
您知道,如果您在代码中添加了对您要完成的目标的描述,这会容易得多。
无论如何,这里有一些可能接近您想要的东西。
def getGroupsOfElements(input: Seq[Element]): Seq[Seq[Element]] =
input.tails.map(x => x.takeWhile(y => distance(x.head,y) < maxDistance)).toSeq