使用 Common Lisp 进行排序时出现意外的列表重复

2024-01-20

编辑:解决方案是将第一个 (let...) 形式中的 '(1) 替换为 (list 1) 。这是因为我试图修改文字数据。谢谢您的帮助! (我会投赞成票,但显然你需要 15 声望......)

这是我在这个网站上的第一篇文章。

我正在解决一些欧拉计划 https://projecteuler.net今天的问题,我在 Common Lisp 中遇到了一些意想不到的列表排序行为(好吧,至少对我来说):

我有一个函数可以找到数字 x 的所有真因数:

(defun divisors (x)
    "Finds all of the proper divisors of x."
    (let ((sq (sqrt x)) (divs '(1)))
        (when (integerp sq) (push sq divs))
        (loop for i from 2 to (1- (floor sq)) do
        (let ((div (/ x i)))
            (when (integerp div)
                (push i divs)
                (push div divs))))
    divs))

这个功能效果很好。例如:

(divisors 100)
==> (20 5 25 4 50 2 10 1)

每当我尝试对结果列表进行排序时,就会出现问题:

(sort (divisors 100) #'<)
==> (1 2 4 5 10 20 25 50)

嗯,效果很好。但是当我再次调用除数时会发生什么?

(divisors 100)
==> (20 5 25 4 50 2 10 1 2 4 5 10 20 25 50)

什么?也许如果我尝试一个不同的号码......

(divisors 33)
==> (11 3 1 2 4 5 10 20 25 50)

在我对结果列表进行排序后,先前查询的除数将保持不变。如果我重新编译该函数,则在再次对结果列表进行排序之前不会出现错误。我假设我在函数定义中的某个地方搞砸了,但我对 Lisp 还很陌生,我找不到错误。这可能是嵌套 (let...) 表单的问题吗?

提前致谢!


经常被问到。

您已经修改了文字数据。您需要消耗新数据。使用函数 LIST 或函数进行复制。

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

使用 Common Lisp 进行排序时出现意外的列表重复 的相关文章

  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • Haskell 中的基因编程

    有 GenProg http hackage haskell org package genprog http hackage haskell org package genprog 例如 但这仅涉及数值优化 在本例中找到描述数据的方程 但
  • Common Lisp 中的未绑定变量

    我是 Lisp 新手 正在阅读 ANSI Common Lisp 第 8 章中的文本生成器示例 我按照该示例并在 LET 变量 prec 的范围内定义了一个函数 see let prec defun see symb let pair as
  • Lisp 内部引用工作

    口齿不清是如何做到的quote内部工作 例如 quote 1 1 2 似乎相当于 list 1 list 1 2 这意味着它是如何递归地象征 Head 值的 这个功能是内置的吗 Run equal quote 1 1 2 list 1 li
  • 如何克服 emacs lisp 闭包缺少局部变量的问题

    我现在正在学习 Emacs Lisp参考手册 http www gnu org software emacs manual elisp html和 Common Lisp 来自LISP https rads stackoverflow co
  • Lisp 当前内存使用情况

    我需要从 Common Lisp 程序中找出当前使用了多少内存 我知道没有可移植的方法 标准函数room以文本形式将信息打印到标准输出 而不是将其作为值返回 但是sb kernel dynamic usage在 SBCL 工作 其他 Com
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • F# 中的非类型化/类型化代码引用与宏卫生之间是否存在关系?

    我想知道 F 中的非类型 类型代码引用与宏系统的卫生之间是否存在关系 他们是否用各自的语言解决相同的问题 或者它们是不同的关注点 元编程方面是唯一的相似之处 即使在这方面 也存在很大的差异 您可以将宏的转换器视为从语法到语法的函数 就像您可
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构
  • 任意类型说明符上的 Defmethod?

    我想做的是 defgeneric fn x defmethod fn x integer 1 Positive integer defmethod fn x integer 1 Negative integer 我想要一个可以与任意类型说明
  • 为什么在基于 Lisp 的语言中习惯上将许多右括号放在一行上?

    通常代码如下所示 one thing another thing arg1 f arg5 r another thing arg1 f arg5 r 为什么不喜欢这样 one thing another thing arg1 f arg5
  • 对于案例,这些表达案例的方法中哪种最好?

    这些都有效 defun testcaseexpr thecase case thecase foo format t matched foo bar format t matched bar funk format t matched fu
  • 在 Java Runtime.getRuntime().exec(...) 中使用引号和双引号

    我正在尝试在 Mac OSX 中从 Java 启动 Lisp 映像 使用控制台中的图像 我输入以下内容 lisp image eval package method some argument 一切都运行良好 在Java中 我在使用传递引号
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • 评估 Common Lisp 宏的参数

    我想制作一个宏 其行为取决于它的参数之一 例如 defclass myvar l initarg l reader l defparameter mv1 make instance myvar l 10 defmacro mac1 v pr
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看

随机推荐

  • grails 3 中的外部属性文件

    我需要从 grails 3 中的外部文件属性读取配置 在 grails 2 x 中 我将文件链接到 grails config locations classpath config properties 在config groovy中 但是
  • 如何以这种特定方式拆分 git commit

    情况 我有一个git提交 在 HEAD 处 其中混合了额外的日志记录代码 然后是一些 真实代码 现在我想做以下事情 编辑掉所有日志代码 基本上清理了代码库 Commit this 我现在在最后两次提交中拥有所需的状态 但它们的顺序错误 首先
  • 用于按分隔符分割字符串的 mySQL 存储过程

    我正在编写一个存储过程 它将传递的字符串分解为 传递分隔符并返回结果的第 n 个元素 n 已通过 也 所以这就是我想出的 CREATE PROCEDURE SPLIT IN strToSplit text IN strDelimiter v
  • 调整具有宽度限制的框架大小

    我有简单的形式TForm1有 2 个面板 首先与Align alLeft第二个是Align alClient和空框TFrame1 当我将以下过程添加到表单中时 一切正常 procedure TForm1 FormCreate Sender
  • 禁用链接以停止 JQuery 中的双击

    我如何禁用所有链接button点击一次后上课 我希望能够在一个地方完成此操作 而不必单独更改所有这些 有什么想法吗 到目前为止我得到了这个 a button click function this attr disabled disable
  • 使用指向非静态成员函数的指针实现回调

    假设我正在开发一个杂货清单管理器 我有一扇窗户 上面有GroceryListDisplay 这是一个显示购物清单上的商品的控件 杂货数据由程序的模型组件存储在GroceryStorage class 要将保存的文件加载到我的程序中 必须使用
  • Flutter SharedPreferences如何加载所有保存的?

    如何加载 SharedPreferences 中保存的所有内容 我保存了很多布尔值 需要将所有布尔值加载到列表中 这就是我保存的方式 SharedPreferences sharedPreferences bool isfavorit ov
  • T-SQL 分割字符串

    我有一个 SQL Server 2008 R2 列 其中包含一个需要用逗号分隔的字符串 我在 StackOverflow 上看到了很多答案 但没有一个在 R2 中有效 我已确保我对任何拆分函数示例具有选择权限 非常感谢任何帮助 我之前用过这
  • R中Box Cox变换故障排除(需要使用for循环或apply)

    请在下面找到我的数据 行是疾病组 0 对照 1 溃疡性结肠炎和 2 克罗恩病 列是基因表达值 structure c 5 54312e 05 5 6112e 06 9 74312e 05 1 3612e 06 1 29312e 05 7 2
  • R 中 nlme 线性混合模型中相互作用显着性的检验

    I use lme函数在nlme用于测试因子水平的 R 包items与因子水平有显着的交互作用condition 因素condition有两个级别 Control and Treatment 以及因子items有 3 个级别 E1 E3 我
  • 如何在ubuntu-18.04上安装nexus

    我需要帮助在 ubuntu 18 04 上安装 nexus oss 我在互联网上找不到任何 apt get 命令 我尝试在 sudo apt get search nexus 中搜索nexus包 但无法获得正确的nexus版本包 我在网上浏
  • Bootstrap Affix 插件内存泄漏

    这些行 https github com twbs bootstrap blob master js affix js L19 L21在引导程序词缀插件中似乎会导致内存泄漏 因为窗口获取对从未释放的词缀实例的引用 作为解决方法 我使用此代码
  • OpenAPI 生成器的 Gradle 配置

    当将 OpenAPI 生成器与 Gradle 一起使用时 我希望将性别源发送到其他源生成器插件使用的标准目录 类似 Maven 生成源的东西 到目前为止 我还无法做到这一点 特别是限制生成 Java 源类而不是整个 原型项目 看来 Open
  • 在 AVX 寄存器内循环字节的有效方法

    摘要 tl 博士 除了进行 2 倍移位并将结果混合在一起之外 还有什么方法可以按位旋转 YMM 寄存器中的字节 使用 AVX 对于 YMM 寄存器中的每 8 个字节 我需要向左旋转 7 个字节 每个字节都需要比前一个字节向左旋转一位 因此
  • 如何为 SASS 变量中的 fs-* 类自定义 Bootstrap 5 字体大小

    如何更改 Bootstrap 5fs 上课于sass 因为在文档 https getbootstrap com docs 5 0 utilities text variables仅显示如何修改h 类如h5 font size 但不是fs c
  • Spring MVC:如何修改从控制器发送的json响应

    我已经使用如下控制器构建了一个 json REST 服务 Controller RequestMapping value scripts public class ScriptController Autowired private Scr
  • 64 位 Windows API:C/C++“DWORD”的大小是多少?

    我只安装了 32 位 Windows 因此我无法亲自验证这一点 如果我没理解错的话 微软API中各个地方使用的DWORD都是参考原来的16位字 和现在的硬件架构无 关 那么 即使我最终编译并链接我的应用程序以在 64 位 Windows 中
  • 有没有办法从 UITableView 中删除分隔线?

    我正在寻找一种在普通模式下完全删除 UITableView 中的分隔线的方法 这是在分组中自动完成的 但这也会以难以测量的方式改变表格的尺寸 我已将分隔线颜色设置为 colorClear 但这并不能完全解决问题 当我尝试在单元格中绘制自定义
  • 将文本文件中的数据读入 VBA 数组

    我有以下 VBA 代码 Sub read in data from txt file Dim dataArray As String Dim i As Integer Const strFileName As String Z sample
  • 使用 Common Lisp 进行排序时出现意外的列表重复

    编辑 解决方案是将第一个 let 形式中的 1 替换为 list 1 这是因为我试图修改文字数据 谢谢您的帮助 我会投赞成票 但显然你需要 15 声望 这是我在这个网站上的第一篇文章 我正在解决一些欧拉计划 https projecteul