OCaml 中的惰性“n 选择 k”

2023-12-25

作为枚举集合的更大问题的一部分,我需要编写一个 OCaml 函数“choose”,它接受一个列表并输出为由该列表的元素组成的所有可能的大小为 k 的序列的列表(不重复序列,这可以可以通过排列相互获得)。它们在最终列表中的顺序无关。

例如,

choose 2 [1;2;3;4] = [[1;2];[1;3];[1;4];[2;3];[2;4];[3;4]]

有任何想法吗?

我想让整个事情变得懒惰,输出一个懒惰列表,但如果你有一个严格的解决方案,那也会非常有用。


这是一个严格且次优的版本。我希望这是清楚的。它通过假设输入列表中没有重复项并仅生成与原始列表中顺序相同的子列表来避免重复。

长度计算可以通过传递来分解l的长度作为参数choose。这会使代码的可读性降低,但效率更高。

对于惰性版本,请在代码上添加“lazy”和“Lazy.force”...

let rec choose k l =
  if k = 0 
  then [ [] ]
  else
    let len = List.length l in
    if len < k
    then []
    else if k = len
    then [ l ]
    else
      match l with
      h :: t ->
          let starting_with_h =
            (List.map (fun sublist -> h :: sublist) (choose (pred k) t))
          in
          let not_starting_with_h = choose k t in
          starting_with_h @ not_starting_with_h
      | [] -> assert false
;;
  val choose : int -> 'a list -> 'a list list = <fun>

# choose 3 [1; 2; 3; 4; 5; 6; 7] ;;                        
- : int list list =
[[1; 2; 3]; [1; 2; 4]; [1; 2; 5]; [1; 2; 6]; [1; 2; 7]; [1; 3; 4]; [1; 3; 5];
 [1; 3; 6]; [1; 3; 7]; [1; 4; 5]; [1; 4; 6]; [1; 4; 7]; [1; 5; 6]; [1; 5; 7];
 [1; 6; 7]; [2; 3; 4]; [2; 3; 5]; [2; 3; 6]; [2; 3; 7]; [2; 4; 5]; [2; 4; 6];
 [2; 4; 7]; [2; 5; 6]; [2; 5; 7]; [2; 6; 7]; [3; 4; 5]; [3; 4; 6]; [3; 4; 7];
 [3; 5; 6]; [3; 5; 7]; [3; 6; 7]; [4; 5; 6]; [4; 5; 7]; [4; 6; 7]; [5; 6; 7]]

EDIT:

A lazy_list_append从下面的评论看来有必要:

type 'a node_t =             
      | Empty
      | Node of 'a * 'a zlist_t
and 'a zlist_t = 'a node_t lazy_t

let rec lazy_list_append l1 l2 =
  lazy 
    (match Lazy.force l1 with
      Empty -> Lazy.force l2 
    | Node (h, lt) ->
    Node (h, lazy_list_append lt l2))
;;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OCaml 中的惰性“n 选择 k” 的相关文章

  • Clojure 函数 - 返回最后一条语句之前计算的值

    我有一些用 Clojure 编写的测试 这是一个简单的例子 defn test1 start server run pvt and expect PVT 0 stop server 我想返回 run pvt and expect 的结果 但
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • AppRegistryNotReady:翻译基础设施无法初始化

    当我尝试访问我的应用程序时 出现以下错误 AppRegistryNotReady 翻译基础设施无法 在应用程序注册表准备好之前初始化 检查你是否没有 在导入时进行非惰性 gettext 调用 这是我的 wsgi py 文件 WSGI con
  • 如何使用 opam 安装特定版本的 ocaml 编译器

    如何使用 opam 或其他包管理器 安装特定版本的 ocaml 编译器 和兼容包 我快速浏览了 opam 文档 但没有找到相关信息 我需要 ocaml 编译器 最好是本机代码编译器 来构建 unison 一个文件同步软件 我需要使用相同版本
  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • 在自己的定义中使用变量?

    无限流 val ones Stream Int Stream cons 1 ones 一个值怎么可能在它自己的声明中使用呢 看起来这应该会产生编译器错误 但它确实有效 它并不总是递归定义 这实际上有效并产生 1 val a Int a 1
  • 纯函数可以异步吗?

    在浏览纯函数的定义时 它通常定义有两个特征 1 给定相同的输入应该产生相同的输出 2 不应产生任何副作用 这是否也意味着纯函数不应该是异步的 如果不是 怎么会这样 如果是的话 我很想看到 JavaScript 中异步纯函数的一些示例 是的
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 我应该选择哪种函数式编程语言作为第一种函数式编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想学习一种函数式编程语言 以了解不同的编程范例 我的编程背景 Java 我刚刚通过了 SCJP 考试 一些 ruby 和非常有限的 Rails
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • OCaml 中的用户定义打印机

    printf fprintf等 全部接受 a转换 手册上说对于 a 用户定义的打印机 采用两个参数 并将第一个参数应用于 outchan 当前输出通道 和第二个参数 因此 第一个参数的类型必须为 out channel gt b gt un
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • Vim 脚本中的“reduce”函数

    Vim 脚本有一些非常基本的函数式编程工具 It has map and filter 但据我所知它缺乏reduce 功能 Reduce https en wikipedia org wiki Fold 28higher order fun
  • OCaml 中的不可变变量

    我正在学习 OCaml 我对变量的不变性有点困惑 根据我正在读的书 变量是不可变的 到目前为止一切顺利 但到底为什么我可以这样做 let foo 42 let foo 4242 我缺少什么 我认为最好的解释方法是举个例子 考虑以下代码 在
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是

随机推荐

  • Java 中的国际象棋位板实现

    我正在寻找创建一个基本的国际象棋 或者如果失败 跳棋 跳棋 引擎 研究完该主题后 我相当有信心我想要使用一系列位板 我基本理解这个概念 但在用 Java 表示它们时遇到困难 我尝试使用 long 将棋盘上的白色棋子表示为 1 将其他所有棋子
  • Android - 将字符串转换为字节[]

    我想将 icon 字符串转换为字节数组 然后将其转换为位图 问题是模拟器中的图像未显示 我想我做得不对 但我知道为什么 我将非常感谢你的帮助 提前致谢 这是我的 JSON 数据 project abbreviation abd custom
  • 使用进位标志进行多字加法

    GCC 有 128 位整数 使用这些我可以让编译器使用mul or imul仅一个操作数 指令 例如 uint64 t x y unsigned int128 z unsigned int128 x y 产生mul 我已经使用它创建了一个
  • 使用maven和jenkins部署到weblogic

    我们在项目中使用 Jenkins 在开发环境中进行构建和部署 我已经在 jenkins 中使用 maven 成功创建了一个 war 文件 现在我必须创建另一个作业来将该 war 文件部署到 weblogic 服务器中 但是 我不知道在詹金斯
  • 当 src 不是有效站点时,Safari 不会调用 iframe onload

    对于以下 iframe Safari 永远不会调用 onload 函数 并且不会在 iframe 中显示任何内容 我测试过的所有其他浏览器都会调用 onload 并显示默认错误网页 为什么会发生这种情况 如果这个问题没有解决方案 那么我需要
  • 如何在winform中打上绿色勾号或红色叉号?

    有没有一种方法可以在 Windows 窗体中的标签旁边添加绿色勾号或红色十字 基本上我需要显示配置是否成功 我正在使用c Thanks 很容易做到 您可以在文本标签旁边添加两个图像 甚至是我在本示例中使用的标签 然后手动切换Visible财
  • 了解 CompletableFuture::runAsync

    我刚刚读过文档 https docs oracle com javase 8 docs api java util concurrent CompletableFuture html runAsync java lang Runnable
  • 交替行的 jQuery 表格样式与 CSS 表格样式

    对于服务器上生成的奇数 偶数行 使用带有类的 CSS 更快 更好 还是使用 jQuery 设置条纹样式更快 更好document Ready 我想开始使用 jQuery 来使我的标记不那么混乱 但我不确定性能 特别是对于较大 最多 200
  • 在 JS 中计算直方图的相似值的最佳方法是什么?

    我正在尝试创建随机生成的数据的直方图 因此目前我正在执行以下操作 假设创建了以下数组 returns 0 0024 0 0231 0 014 0 0005 0 008 我使用以下方法遍历数组 returnsRounded x Math ro
  • 这种广度优先搜索可以变得更快吗?

    我有一个数据集 它是一个大型未加权循环图 循环发生在大约 5 6 条路径的循环中 它由大约 8000 个节点组成 每个节点有 1 6 个 通常大约 4 5 个 连接 我正在进行单对最短路径计算 并实现了以下代码来进行广度优先搜索 from
  • 从资源设置应用程序图标时应用程序大小会增加

    我有一个大小为 16kb 的应用程序 通过 项目属性 菜单添加图标资源后 应用程序的大小如预期增加到 299kb 现在 在 属性 应用程序 下 当我将图标文件设置为 Resource IconName ico 时 文件大小再次增加到 581
  • 带有临时链接的提交按钮

    好的 我不知道我在做什么 我要回去帮助人们找工作 我在 Fiddle 中运行了所有内容 并将其迁移到两个不同的编辑器 一切都显示正常 但没有任何反应 没有警报 没有单击提交 我在我的笔记本电脑上尝试了一下 显示了两个页面 一个页面上有 pr
  • D3 - 重置 SVG 对象动画

    我正在用交互式标记制作一个图表 每个标记都沿着侧轴开始 单击时会移动到沿线的位置并增大尺寸 我让图标移动和增长 但在重置图表时遇到问题 我可以通过第二次单击使图标返回到其原始位置 但是第二次单击后图标将不再响应单击 我怀疑这很简单 但我没有
  • 防止 git checkout 覆盖文件

    另一位开发人员将他的 rvmrc 检查到了 git 存储库中 我已经删除了它并将其添加到 gitignore 但每次需要返回时它都会覆盖我的 rvmrc 我使用的是 OSX 所以我发现我可以使用 OSX 文件锁定机制 获取信息中的 锁定 复
  • 如何在数据库中保存标签(关键字)?

    我想使用 php 和 mysql 创建一个简单的标签系统 以便用户可以通过表单添加一些标签 我的问题是我应该将标签保存为单个数据库列中的数组吗 例如 tag1 tag2 tag3 或者我应该在数据库表中有单独的列 我应该在每列中保存每个标签
  • PowerShell 按嵌套字段选择和分组

    我有以下对象结构 resources Array resource PSCustomObject 名称 字符串 Tags PSCustomObject 所有者 字符串 more 所以我可以做 resources 0 Tags Owner并获
  • 在 iOS 中使用 AVCapture 捕获视频时进行缩放

    我正在使用 AVCapture 捕获视频并保存它 但我需要提供缩放选项 例如捏合缩放或通过缩放按钮 此外 视频的保存方式应与显示的方式完全相同 我的意思是当放大时 应以缩放的方式保存 如有任何帮助 链接将不胜感激 我设置 AVCapture
  • perl 正则表达式中的 OR 条件

    我正在尝试编写一个脚本 通过 Perl 中的正则表达式执行 OR 函数 我编写了一段代码 其中如果字符串包含 D 或 E 后跟 P 则应该打印 D或E后跟P 否则 D或E后不跟P 假设如果我给出 s ABCDEABCDEPABCDEAB 它
  • SameSite Cookie 标头和 Websocket 不起作用

    在我们设置 SameSite None 之前 我们的游戏无法在任何第 3 方网站上运行 正如这段视频中所示 https youtu be AYCvCrZyDk https youtu be AYCvCrZyDk 网站已加载 但网络套接字无法
  • OCaml 中的惰性“n 选择 k”

    作为枚举集合的更大问题的一部分 我需要编写一个 OCaml 函数 choose 它接受一个列表并输出为由该列表的元素组成的所有可能的大小为 k 的序列的列表 不重复序列 这可以可以通过排列相互获得 它们在最终列表中的顺序无关 例如 choo