使用递归在Scheme中进行排列

2023-12-13

我发现了以下一段代码,它在Scheme中进行了排列。我的意思是,如果我输入类似的参数 '(1 2 3) 它会给我:

((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))

代码如下:

(define (remove x lst)
  (cond
    ((null? lst) '())
    ((= x (car lst))(remove x (cdr lst)))
    (else (cons (car lst) (remove x (cdr lst))))))

(define (permute lst)
  (cond
    ((= (length lst) 1)(list lst))
    (else (apply append(map(lambda (i) (map (lambda (j)(cons i j))
                                            (permute (remove i lst))))lst)))))

第一个函数remove看起来很简单,只是通过将x表示的字符与列表的开头进行比较并与列表的其余部分递归调用来删除x表示的字符,即使它是否重复。

我不太明白的部分是排列函数。据我所知,map 将一个函数应用于参数的每个元素(在本例中是一个列表),而 apply 只是一次将一个函数完全应用于所有参数。那么这一行到底在做什么:

(apply append(map(lambda (i) (map (lambda (j)(cons i j))
                                                (permute (remove i lst))))lst)))))

对我来说,它似乎只想创建一个包含两个元素的对:i 和 j,它们将成为一个元素排列后的列表(如果我们假设列表只是一堆串联的对)。但是再次调用 i 进行排列和删除的部分,那部分在做什么?它只是删除列表的头部来生成列表的子集,其中该对的头部元素 i 固定,直到用完元素?

有什么帮助吗?

Thanks


让我们从内到外把它拆开。使固定lst并将内部表达式应用于其元素之一。

> (define lst '(1 2 3))
> (define i 1)
> (permute (remove i lst))
((2 3) (3 2))

看起来不错:内部表达式删除一个元素并递归地生成列表其余部分的排列。现在map the lambda在这些排列上:

> (map (lambda (j) (cons i j)) (permute (remove i lst)))
((1 2 3) (1 3 2))

所以内在map产生以某些开头的所有排列i,我们设置为1 here.

外层map确保所有排列都是通过考虑所有元素来生成的lst作为第一个元素。

> (map (lambda (i) (map (lambda (j) (cons i j))
>                       (permute (remove i lst))))
>      lst)
(((1 2 3) (1 3 2)) ((2 1 3) (2 3 1)) ((3 1 2) (3 2 1)))

但这会生成嵌套过多的列表。正在申请append展平列表列表,

> (append '(1 2) '(3 4) '(5 6))
(1 2 3 4 5 6)
> (apply append '((1 2) (3 4) (5 6)))
(1 2 3 4 5 6)

这样我们就得到了一个简单的排列列表。

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

使用递归在Scheme中进行排列 的相关文章

  • SICP中的图片语言如何使用框架?

    我似乎无法理解 SICP 中框架的实现 书中指出 我们将使用单位正方形中的坐标 0 图像如何表示为坐标 我能想到的唯一解释是 所有图像 都是线条 只能映射到一个框架 该框架的边界不能超过单位正方形的边界 但我对此表示怀疑 因为书中的下一行解
  • 球拍累加器列表功能

    我正在研究创建您可能玩过的 2048 游戏的具体步骤 它位于许多在线网站上 基本上这个函数所做的就是 1 所有空格移到后面 2 如果前两个数字相等 则加倍并检查每两个数字 这些是我所坚持的步骤的说明 设计一个向左滑动的函数 使其运行sing
  • 方案中的河内塔(递归)

    今天在scheme中写了如下代码 但是求值错误 请不要告诉我我编程很糟糕 我知道这是一个经典的递归问题 但我遇到了麻烦 define towers of hanoi n source temp dest if n 1 begin displ
  • 在Scheme中编写一个自动记忆器。有关宏和包装器的帮助

    我在Scheme中编写自动记忆器时遇到了一些问题 我有一个有效的 memoize 函数 它创建一个哈希表并检查该值是否已经计算出来 如果之前已经计算过 则返回值 否则调用该函数 define memoizer fun let a table
  • 对方案中的列表进行排序

    如何编写一个排序算法 以升序返回列表 ex 1 3 5 2 9 回报 1 2 3 5 9 大多数Scheme 实现都附带一个对列表进行排序的过程 如果您的实现没有提供这一功能 那么为您提供一个并不困难 下面是快速排序算法的实现 gt def
  • 方案单词列表 eq?

    我有一个问题 我需要查找列表是否等于第二个列表 例如 set eq 1 2 3 1 2 3 gt t set eq 1 2 3 2 3 4 gt f 这些例子在我的程序中是正确的 但这个例子不是 set eq quote quote one
  • 方案中的延续传递风格?

    我遇到了这段代码在维基百科上 http en wikipedia org wiki Continuation passing style define pyth x y k x x lambda x2 y y lambda y2 x2 y2
  • 按方案中的第一个元素对列表列表进行排序

    例如 我正在研究按第一个元素对列表列表进行排序 排序 列表 2 1 6 7 4 3 1 2 4 5 1 1 预期输出 gt 1 1 2 1 6 7 4 3 1 2 4 5 我使用的算法是冒泡排序 我修改了它来处理列表 但是 该代码无法编译
  • 查找 lambda 表达式中的自由变量

    有谁知道如何找出 lambda 表达式中的自由变量 自由变量是不属于 lambda 参数的变量 我当前的方法 这对我毫无帮助 是简单地使用 car 和 cdr 来遍历表达式 我的主要问题是确定一个值是否是一个变量或者它是否是方案原语之一 有
  • 传递给过程的列表转换为过程内列表的列表

    我正在 DrRacket 上调试这段代码 lang racket define last element on list lambda l cond null l null cdr l car l else last element on
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 方案:为什么内部定义比外部定义快?

    我尝试运行下面的程序 define odd internal x define even x if zero x t odd internal sub1 x if zero x f even sub1 x define odd extern
  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • 如何获取 SICP、Scheme、练习 2.78 等中的 put 和 get 函数

    我正在尝试在 SICP 中做练习 2 78 但 put 和 get 函数未知 我尝试过多种语言 比如相当大 racket r5rs mit scheme mzscheme等 我什至下载了SICP支持 http www neilvandyke
  • 模拟Scheme中Python的范围

    如何在Scheme中创建连续数字的列表 在Python中创建一个从1到10的整数列表是range 1 11 方案有等效的吗 mzscheme version gives Welcome to Racket v5 2 1 Edit Per h
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用Lisp或Scheme进行Java程序的运行时配置

    我现在看到几个项目在实际配置取决于仅在运行时可用的东西时结束 配置 Java 程序的典型方法是根据某些应用程序特定规则读取一个或多个属性文件 然后根据它们的值采取操作 在某一时刻 这种情况会崩溃 您需要在配置中使用实际的程序逻辑 然后可以用
  • Racket 与Scheme 有何不同?

    Racket 是Scheme 的后代 Racket 与 R6RS 有何不同 它添加了什么 删除了什么 或者只是有所不同 我知道 Racket 不仅仅是一种语言 它还是一个语言平台 但我指的是主要的 Racket 方言 Racket 最终基于
  • 方案符号中区分大小写

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

随机推荐

  • WindowsFormsHost 上的工具栏覆盖

    我有一个嵌入在 WPF 窗口内的 WindowsFormsHost 控件中的 SWF 对象 我想在 swf 影片上添加一个工具栏 我下面的代码片段的问题是 当新的子控件添加到主机控件时 或者加载电影 我还没有弄清楚是哪一个 工具栏实际上是不
  • Grails:Spring Security CAS 在 2.2.3 中工作,但在 2.3.0 中不起作用

    我有一个使用 Groovy 2 0 的 Grails 2 2 3 项目 我使用 Spring Security 将其设置为使用 CAS 进行身份验证 使用 LDAP 进行用户角色 当我运行应用程序时 一切都按预期进行 任何人都允许访问 ap
  • 当选择另一个复选框时,如何启用/禁用复选框?

    我了解了如何在选中一个复选框时选中 取消选中或隐藏 显示 但我正在寻找的是当用户单击 快餐 时 当我有 5 个复选框 快餐 餐饮 外带 送货 和 酒吧 时 当用户选中时 其余复选框将被禁用餐饮 休息被禁用 但当用户选中 携带 时 仅快餐和餐
  • imagettftext() - 找不到字体位置

    我正在使用 imagettftext 函数创建自定义验证码脚本 我已在运行 PHP 版本 5 3 8 的 PC 上成功运行并测试了代码 但是当我上传到运行 PHP 版本 5 2 17 的共享托管帐户时 出现以下错误 Warning imag
  • window.fullScreen=true 不起作用

    我想以全屏模式打开我的 html 页面 我尝试在 body 的 onload 事件处理程序中执行此 javascript window fullScreen true 但不幸的是这似乎不起作用 有没有其他方法可以达到同样的效果 我不认为你可
  • Identity列增量值差距巨大

    我创建了一个带有标识列的表 当我在该表中插入值时 标识列显示值之间存在巨大的增量差距 身份值从 6 跳到 10001 这是按部门 id 排序的输出 输出截图在这里 这是我创建的表 Create Table STG2 Department D
  • 更改 Eclipse 中的默认 XML 编辑器

    Eclipse 挂起时使用 XML 默认编辑器太慢并且会出现很多问题 我读到 如果我们更改编辑器 它就可以正常工作 那么如何删除现有编辑器 您可以自定义它们 窗口 gt 首选项 gt 常规 gt 编辑器 gt 文件关联 在那里 您必须选择一
  • jqGrid 中使用工具栏搜索默认在列中间搜索

    阅读 jqGrid wiki 后 并以以下示例为例 jqGrid 中不区分大小写的搜索 包括隐藏字段 我找不到我想做的事情 是否有任何搜索选项可以在列中的任何位置启用搜索 自动通配符 如果该列包含 Apple Iphone 我将能够通过搜索
  • 如何将消息重定向到死信队列Azure服务总线

    我正在使用隔离的天蓝色函数从队列接收消息 我需要验证收到的消息 如果无效 则将其发送到死信队列 我发现唯一的方法是抛出异常 重试 10 次后 消息将被移至死信队列 当然这不是一个好的解决方案 也许有人面临同样的任务 谢谢 Function
  • 如何让这个嵌套通用参数系统正常工作?

    所以我正在努力让一个相当复杂的系统运行起来 这是我正在尝试的基础知识 Rules abstract class Rule stuff class ExampleRule extends Rule stuff 处理程序 abstract cl
  • 在 Swift 4 中,如果按下“Backspace”按钮且文本字段为空,如何移动到上一个 UITextField?

    我正在尝试解决这个问题 当我使用下面的代码时 我可以从一个文本字段移动到下一个文本字段 然后单击 退格 按钮 但仅当文本字段中有文本时才有效 我的问题 当文本字段为空时 如何单击 退格 按钮并移至上一个文本字段 第二个问题 如何去掉屏幕上闪
  • 通过 Android 访问 Google 帐户 ID/用户名

    如何在代码中访问用户的 Google 帐户 ID 用户名 我正在构建一个应用程序 它将调用 Web 服务来存储数据 并且我想识别提交数据的人的身份 我遇到了同样的问题 这两个链接为我解决了 第一个是这个 如何在 Android 手机上找回已
  • 字符串数组列表成一个逗号分隔的字符串

    尝试将字符串的 Arraylist 转换为一个大逗号分隔的字符串 但是当我使用 String joined TextUtils join participants 调试器显示参与者的大小为 4 但是连接值为 因此为空 private Arr
  • Symfony 1.4 邮件程序中的电子邮件正文?

    我正在使用 Symfony 1 4 邮件程序 在其中构建电子邮件所需的各个部分 然后使用以下命令将其发送出去 this gt getMailer gt composeAndSend sender recipient subject body
  • 在反应本机地图上需要未知模块“未定义”

    我想实现react native mapshere 但是当我导入上面的 MapView 时App js与代码import MapView from react native maps 我收到此错误 需要未知模块 未定义 如果您确定该模块存在
  • 子进程调用无效参数或选项未找到

    我试图在 Linux 上使用 subprocess call 调用 ffmpeg 命令 但我无法获得正确的参数 之前 我使用了 os system 并且它有效 但不推荐这种方法 使用带破折号的参数 例如 i 会出现此错误 Unrecogni
  • 如何使用 JHipster 注册表修复无效的 JWT [Docker]?

    我想用 JHipster 构建一个微服务软件 我正在 Docker 中运行 jhipster registry v3 2 4 我还有一个微服务应用程序 使用生成器 5 0 1 创建 但我没有生成网关应用程序 我在 docker compos
  • 在SQL / MySQL中,连接语句中的“ON”和“WHERE”有什么区别?

    以下语句给出相同的结果 一个是使用on 另一个使用where mysql gt select from gifts INNER JOIN sentGifts ON gifts giftID sentGifts giftID mysql gt
  • 具有抽象类的 JPA 实体继承 - ConstrainViolationException

    我正在尝试使用 JPA 注释和抽象类设置实体继承 我们的目标是让 DAO 通过其扩展与基础对象一起工作 以便我们可以通过使用不同的实体扩展 切入点和覆盖来对同一应用程序进行修改 而无需更改提供者和管理器 例子 基础应用程序堆栈有一个 DAO
  • 使用递归在Scheme中进行排列

    我发现了以下一段代码 它在Scheme中进行了排列 我的意思是 如果我输入类似的参数 1 2 3 它会给我 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 代码如下 define remove x lst cond