gpt4 book ai didi

lisp - 使用带有 Common Lisp 的排序的意外列表重复

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:16 25 4
gpt4 key购买 nike

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

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

我正在解决一些 Project Euler今天遇到问题,我在 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 或函数复制。

关于lisp - 使用带有 Common Lisp 的排序的意外列表重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com