是否有一个功能性的编程习惯用于“从列表的开头选择并减少直到结果满足谓词”?

格夫拉索夫

假设我有一个数字列表,我需要知道从一开始就必须选择多少个元素才能至少获得所需的总和。

该算法很简单:我从列表的开头选择数字,直到所有选择的数字之和超过一定数量为止。

我可以这样写命令式的代码:

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]

是否有既定的功能惯用法,或者可能是比我尝试概括此功能更好的性能和表达能力的组合?

该示例在Kotlin中进行,但我更喜欢与语言无关的答案,尽管可以接受任何语言的答案,只要它们呈现了描述此操作的高级成语即可。

背风处

您想要的是一个scan后跟一个takeWhilescan就像折叠一样,除了它返回一系列连续的状态值。您可以返回一对连续状态,(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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果在同一查询中的另一结果行中满足条件,是否有办法减少一个结果行中的值

来自分类Dev

基于功能性谓词对列表的连续元素进行分区

来自分类Dev

反应式编程是否与功能性编程联系在一起?

来自分类Dev

使用此“快捷功能”是否是一个好习惯?

来自分类Dev

习惯用法scala,用于从两个选项中获取一个选项,如果有两个选项,则抛出异常

来自分类Dev

习惯用法scala,用于从两个选项中选出一个选项,如果有两个选项,则抛出异常

来自分类Dev

是否有用于下垂的python习惯用法?

来自分类Dev

在直观的良好实践中找不到设计/编程习惯用法:给对象构造一个确定的时期

来自分类Dev

功能性Python-多个字典到一个字典

来自分类Dev

在JavaScript中以功能性样式将elem与下一个加入

来自分类Dev

是否有一个简单的SPARQL构造查询以通过某些谓词值选择所有与主题相关的语句

来自分类Dev

带有多个谓词的过滤器,优雅的功能性方法

来自分类Dev

Scala收集选择元素,直到第一个满足要求

来自分类Dev

满足一个条件时选择所有组

来自分类Dev

是否有一个习惯来“计算”一个值?

来自分类Dev

检查列表的所有元素是否都以另一个列表的所有不同符号开头

来自分类Dev

如果不满足某些前提条件,是否有一个Jest挂钩可用于退出测试?

来自分类Dev

是否有一种惯用的方式来返回一个指针,该指针可以选择拥有其值

来自分类Dev

是否有用于在文件路径中添加斜杠的习惯用法?

来自分类Dev

SQL习惯用法,用于检查列中的值是否统一

来自分类Dev

是否有一个rxjs运算符来获取一个可观测值列表并一次订阅N直到所有操作完成?

来自分类Dev

是否有内置的Django模板过滤器来查找列表中满足条件的第一个值?

来自分类Dev

功能性Javascript映射/减少准备报告数据

来自分类Dev

如何根据一个谓词比较两个列表的元素并根据另一个谓词进行选择?

来自分类Dev

是否有一个C预处理程序宏来获取功能参数列表?

来自分类Dev

是否有一个简单的功能可以基于Python中的值条件构建子列表?

来自分类Dev

是否有一个与Mathematica的Sow和Reap函数等效的R用于构建列表?

来自分类Dev

如何编写一个循环,直到满足条件为止

来自分类Dev

谓词检查元素是否在列表中的另一个元素后面

Related 相关文章

  1. 1

    如果在同一查询中的另一结果行中满足条件,是否有办法减少一个结果行中的值

  2. 2

    基于功能性谓词对列表的连续元素进行分区

  3. 3

    反应式编程是否与功能性编程联系在一起?

  4. 4

    使用此“快捷功能”是否是一个好习惯?

  5. 5

    习惯用法scala,用于从两个选项中获取一个选项,如果有两个选项,则抛出异常

  6. 6

    习惯用法scala,用于从两个选项中选出一个选项,如果有两个选项,则抛出异常

  7. 7

    是否有用于下垂的python习惯用法?

  8. 8

    在直观的良好实践中找不到设计/编程习惯用法:给对象构造一个确定的时期

  9. 9

    功能性Python-多个字典到一个字典

  10. 10

    在JavaScript中以功能性样式将elem与下一个加入

  11. 11

    是否有一个简单的SPARQL构造查询以通过某些谓词值选择所有与主题相关的语句

  12. 12

    带有多个谓词的过滤器,优雅的功能性方法

  13. 13

    Scala收集选择元素,直到第一个满足要求

  14. 14

    满足一个条件时选择所有组

  15. 15

    是否有一个习惯来“计算”一个值?

  16. 16

    检查列表的所有元素是否都以另一个列表的所有不同符号开头

  17. 17

    如果不满足某些前提条件,是否有一个Jest挂钩可用于退出测试?

  18. 18

    是否有一种惯用的方式来返回一个指针,该指针可以选择拥有其值

  19. 19

    是否有用于在文件路径中添加斜杠的习惯用法?

  20. 20

    SQL习惯用法,用于检查列中的值是否统一

  21. 21

    是否有一个rxjs运算符来获取一个可观测值列表并一次订阅N直到所有操作完成?

  22. 22

    是否有内置的Django模板过滤器来查找列表中满足条件的第一个值?

  23. 23

    功能性Javascript映射/减少准备报告数据

  24. 24

    如何根据一个谓词比较两个列表的元素并根据另一个谓词进行选择?

  25. 25

    是否有一个C预处理程序宏来获取功能参数列表?

  26. 26

    是否有一个简单的功能可以基于Python中的值条件构建子列表?

  27. 27

    是否有一个与Mathematica的Sow和Reap函数等效的R用于构建列表?

  28. 28

    如何编写一个循环,直到满足条件为止

  29. 29

    谓词检查元素是否在列表中的另一个元素后面

热门标签

归档