作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个数字列表,并且我需要知道从一开始就必须选择多少个元素才能至少获得所需的总和。
该算法很简单:我从列表的开头选择数字,直到所有选择的数字之和超过一定数量为止。
我可以这样写命令式的代码:
fun pickEnough(list: List<Double>, enough: Double): List<Double>? {
var soFar = 0.0
var index = 0
for (index in 0..list.size) {
soFar += list[index]
if (soFar > enough) {
return list.subList(0, index)
}
}
return null
}
fun <T> pickEnough(list: List<T>, reducer: (T, T) -> T, enough: (T) -> Boolean): List<T>? =
list.indices
.map { index -> list.sublist(0, index) }
.first { sublist -> enough(sublist.reduce(reducer)) }
pickEnough(listOf(5,8,0,0,8), { a, b -> a + b}, { it > 10 }) // [5, 8]
最佳答案
您想要的是一个scan
和一个takeWhile
。 scan
类似于折叠,但它返回一系列连续的状态值。您可以返回一对(x, soFar)
的连续状态,这些状态包含序列中的当前值和当前运行总计。然后,您可以从该序列中获取尽可能多的数据,其中当前值未导致超出期望的总数。例如,在F#中,您可以执行以下操作:
let pickEnough (l: seq<double>) (enough: double): seq<double> =
Seq.scan (fun (_, soFar) x -> (x, x+soFar)) (0.0, 0.0) l |>
Seq.skip 1 |>
Seq.takeWhile (fun (x, soFar) -> soFar - x < enough) |>
Seq.map fst
关于functional-programming - 是否有 "pick from beginning of a list and reduce until the result satisfies a predicate"的功能性编程习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34600461/
我是一名优秀的程序员,十分优秀!