编辑:解决方案是将第一个 (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(使用前将#替换为@)