(方案)递归函数来计算某些列表的所有可能组合?

2023-12-05

计算所有可能的列表组合的递归函数的示例是什么?例如,(combine (list 1 2 3) (list 1 2))应该返回'((1 1) (1 2) (2 1) (2 2) (3 1) (3 2)).


这是我的看法;我首先定义一个助手concat/map,它需要一个列表和一个函数。像普通的一样map,它将该函数应用于列表中的每个元素。不像map,不过,它使用append合并结果而不是cons。这很有用,因为我们想要返回单层列表作为答案:

(define concat/map
  (lambda (ls f)
    (cond
      [(null? ls) '()]
      [else (append (f (car ls)) (concat/map (cdr ls) f))])))

然后,写combine对于两个列表来说很简单。您获取第一个列表的每个元素,然后将其与一个元素结合起来制作每个列表x从第二个列表中。由于这会返回第一个列表中每个元素的答案列表,因此请使用concat/map按照我们想要的方式将其组合在一起:

(define combine
  (lambda (xs ys)
    (concat/map xs (lambda (x)
                     (map (lambda (y) (list x y)) ys)))))

的版本combine对一个或多个列表进行操作,我们称之为combine*,有点棘手。而不是将所有列表组合起来x对于第二个列表中的元素,我们只需递归地求所有剩余元素的乘积ys, 进而cons x到每一个结果上。当只有两个列表要组合时,递归停止,并使用原始列表combine在这种情况下。

(define combine*
  (lambda (xs . ys*)
    (cond
      [(null? ys*) (map list xs)]
      [(null? (cdr ys*)) (combine xs (car ys*))]
      [else (concat/map xs (lambda (x)
                             (map (lambda (y) (cons x y))
                                  (apply combine* ys*))))])))

作为奖励,这种使用模式concat/map做一些工作并结合得到的答案实际上是列表单子。这里虽然简化了,但是结构已经就位了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(方案)递归函数来计算某些列表的所有可能组合? 的相关文章

  • 方案字符串追加?递归复制字符串

    设计一个名为 string dup 的程序 它使用一个字符串 s 和一个数字 n 并返回一个由 s n 次连接而成的字符串 每个 s 实例之间有空格 即 string dup a 3 gt a a a 不使用复制 但我想我们可以使用字符串追
  • 方案如何返回多个值?

    我注意到几乎所有方案函数只能返回一个列表作为输出 下面 我想返回邻居的所有相邻节点的多个值 define neighbors l w if and 1 l 1 w list and l 1 w and 1 l w how to output
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗?

    在研究 Emacs Lisp 的符号单元时 我发现像这样的示例函数 defun a rest x x 我可以打电话 symbol function a 返回 lambda rest x x 如果我愿意的话我可以使用它 gt lambda r
  • 为什么Racket中foldl的定义方式很奇怪?

    在 Haskell 中 与许多其他函数式语言一样 函数foldl被定义为 例如 foldl 0 1 2 3 4 10 这没关系 因为foldl 0 1 2 3 4 根据定义 0 1 2 3 4 但是 在 球拍 中 foldl 0 1 2 3
  • 为什么《小阴谋家》中的所有 lambda 表达式都是如此?

    在从 SICP 学习了一些计划之后 我开始阅读 小计划 我觉得这本书很有趣 并且已经完成了大约四分之一 我注意到我可以在不使用 lambda 的情况下编写许多 大多数 全部 解决方案 而 The Little Scheduleralways
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • Lisp 中的十进制到二进制 - 制作非嵌套列表

    当达到我的递归情况时 我使用list将未来结果附加到当前结果 但由于递归 我最终得到一个嵌套列表 当我有一个导致递归超过五次的数字时 这会导致错误 任何想法如何我可以在一个简单的非嵌套列表中获得结果 例如 CL 用户 100 8 gt BI
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your
  • 方案符号中区分大小写

    据我所知 Scheme 中的符号不 区分大小写 即 eq Hello hello 评估为 t 因为两者都用符号表示 hello 并且scheme具有两个同名符号是同一个对象的属性 然而 这对我来说似乎并非如此 而且事情似乎区分大小写 无论我
  • 内置方案以检查列表包含情况

    在Python中 我可以执行 x in list 来查看列表是否包含x 方案中是否有等效的内置功能可以做到这一点 The R5RS http schemers org Documents Standards R5RS HTML r5rs Z
  • (Emacs) 文本是只读的?

    所以我在 emacs 中工作 突然 slime repl sbcl 说文本是只读的 嗯 这很好 因为现在我无法在其中输入任何内容 我该如何修复 缓冲区是只读的 可以通过以下方式解决C x C q但正如德鲁和菲尔斯所说 文本是只读的 是非常不
  • Common Lisp 包中的外部符号与内部符号

    在 Common Lisp 包的上下文中它们之间有什么区别 我正在阅读 SLIME 文档 一些命令广泛提到了这一点 语法是什么 你的符号export是外部的 in package cl user defpackage str use cl
  • 如何在 Common Lisp 中进行模式匹配

    我不知道 Common Lisp 是否存在模式匹配函数 但我必须制作自己的函数 我对Lisp一无所知 有人可以对学习 Lisp 以及最重要的是如何在 Lisp 中进行模式匹配进行提示吗 我必须传递一个模式和一个事实 并判断它们是否匹配 一个
  • Letrec 有什么好处?

    在阅读 老练的阴谋家 时 我开始了解letrec 我理解它的作用 可以用 Y Combinator 复制 但这本书正在使用它来代替已经重复出现的内容defined 函数对保持静态的参数进行操作 使用旧函数的示例defined 函数本身重复出
  • 程序解释期间高效的增量哈希计算

    我想写一个递归记忆Scheme解释器 在求值过程中的任何时刻 解释器都应该能够检测到它何时接收到之前见过的一对表达式和环境作为参数 简单记忆eval and apply效率低下 每次调用时都需要在哈希表中查找参数eval apply 这需要

随机推荐

  • Springfox swagger - 没有 Spring Boot jersey 和 gradle 的 api 文档

    我有一个带有 jersey 和 gradle 的 spring boot 应用程序 我正在尝试使用 springfox 自动生成 API 文档 我已按照此处的步骤操作 http springfox github io springfox d
  • 你能用 pty 做什么?

    阅读了各种资源 包括http www linusakesson net programming tty 我对伪终端的结构和使用仍然很困惑和好奇 在 Linux 终端 bash 不是 tty 中 我们有三个流 stdin stdout std
  • C++ 中初始化变量的 = 和 {} 语法之间的差异

    我读过相当多的 C 代码 并且遇到过两种初始化变量的方法 方法一 int score 0 方法二 int score 我知道int score 会将分数初始化为 0 因此int score 0 这两者有什么区别 我读过了初始化 括号与等号但
  • 字符串生成器与列表

    我正在读取包含数百万行的多个文件 并且正在创建具有特定问题的所有行号的列表 例如 如果特定字段留空或包含无效值 所以我的问题是 跟踪可能超过一百万行的数字列表的最有效的日期类型是什么 使用字符串生成器 列表或其他东西会更有效吗 我的最终目标
  • 如何保护共享工作簿中的工作表?

    我有一个将在多个用户之间共享的工作簿 将运行宏以在 Excel 工作表中输入来自用户表单的数据 该工作表需要受到保护 以便用户无法对其进行编辑 我有 ws Unprotect 我的宏代码 ws Protect UserInterfaceOn
  • 有没有办法降低禁用按钮上图像的饱和度?

    有没有办法可以降低禁用按钮中图像的饱和度 例如 ICommand CanExecute false 或者我需要使用单独的图像 样式 触发器 我为此使用了一种特殊的样式 当按钮被禁用时 它会降低图像的不透明度 是的 如果按钮绑定到命令 这也有
  • initFields(scales = scales) 中的错误:找不到函数“initRefFields”

    我的代码中有一个 ggplot2 绘图函数 当文件作为 R 代码来源时 该函数工作正常 但是当我将此函数包含在 R 包中时 当然 我在包的描述和命名空间文件中包含 ggplot2 和比例 我得到以下内容错误 Error in initFie
  • 实体框架代码优先延迟加载

    我有两个对象类 public class User public Guid Id get set public string Name get set Navigation public ICollection
  • 对 big.matrix 进行子集化的正确方法

    我想知道是否有一种 正确 的方法来对 R 中的 big matrix 对象进行子集化 对矩阵进行子集化很简单 但该类总是恢复为 矩阵 当处理像这样的小数据集时 这不是问题 但对于大量数据集 但对于极大的数据集 子集仍然可以从 big mat
  • 你能将“指向函数指针的指针”转换为 void*

    受到对我的答案的评论的启发here 这个步骤序列在 C 标准 C11 中合法吗 创建一个函数指针数组 获取指向第一个条目的指针并将其强制转换指向函数指针的指针 to void 对其执行指针算术void 将其投射回指向函数指针的指针并取消引用
  • JVM会自动关闭文件吗?

    我在某处读到 没有必要自己关闭它 只需保留它 JVM 会帮助你做到这一点 这是真的吗 假设我需要从文件中获取数据 Source fromFile fileName getLines 直接地 无需 val source Source from
  • IOError:13,通过 Python 写入 /etc/hosts 时“权限被拒绝”

    我正在开发一个 Python 应用程序 需要访问主机文件以添加几行 一切都在我的测试文件上运行 但是当我告诉程序实际修改 etc hosts 中的主机文件时 我收到 IOError 13 据我了解 我的应用程序没有 root 权限 我的问题
  • 如何使用优先队列?

    我如何获得PriorityQueue对我想要它排序的内容进行排序 另外 两者之间有区别吗offer and add方法 使用构造函数重载 它需要一个Comparator
  • arulesSequences 中的 cspade 函数引发连接错误

    我在用arulesSequencesR 库 这部分代码工作正常 x lt read baskets con system file misc zaki2 txt package arulesSequences info c sequence
  • __m256d TRANSPOSE4 等效吗?

    Intel 已包含 MM TRANPOSE4 PS 来转置 4x4 向量矩阵 我想用 m256d 做同样的事情 但是 我似乎无法弄清楚如何以相同的方式获取 mm256 shuffle pd MM TRANSPOSE4 PS代码 define
  • Zebra打印机C#代码打印条码标签

    这是我的 prn 文件 I8 A 001 Q0001 0 q831 rN S5 D10 ZT JF O R20 0 f100 N B775 188 2 1 2 6 160 B SM00020000 X0 199 1 0 200 P1 SM0
  • os x 上自定义类似 emacs 的键绑定:DefaultKeyBinding.dict 无法按预期工作

    我正在尝试添加 OS X 10 7 5 中类似 emacs 的键绑定 特别是 在默认键绑定中 alt d 和 alt b 插入特殊字符 而我希望它们删除一个单词并移回一个单词 我已经创建了一个文件 Library KeyBindings D
  • $("select>option[text='xxx']") 不起作用

    我需要用文本设置默认选定值 这是我的代码 HTML
  • 绘制给定半径和两个位置的曲线

    我有两个位置 我必须在两个位置之间根据半径绘制一条曲线 我画了一张图 我知道怎么画圆 但如何只绘制圆的一部分呢 以下是已知参数 当前位置 下一个地点 曲线 圆的半径 如果有人可以告诉我如何获取当前位置和下一个位置之间的圆上的点 我可以使用折
  • (方案)递归函数来计算某些列表的所有可能组合?

    计算所有可能的列表组合的递归函数的示例是什么 例如 combine list 1 2 3 list 1 2 应该返回 1 1 1 2 2 1 2 2 3 1 3 2 这是我的看法 我首先定义一个助手concat map 它需要一个列表和一个