正如标题所说,我试图将项目附加到名为solution的列表中,下面是代码:
(defun add-solution (n)
(let ((solution))
(do((current-node '() (next-state current-node n nil)))
((equal current-node '(0 0 0 0)) solution)
(if (goal-test current-node n)
(progn
(format t "Cur: ~S~%" current-node)
(setq solution (append solution (list current-node)))
(format t "Solution: ~S~%" solution)
)
)
)
)
)
每次新的当前节点都是:(1 7 8 14), (2 4 11 13),
,但是当循环返回时returns ((1) (2))..
我需要的是(((1 7 8 14) (2 4 11 13))
。不确定那里发生了什么?
编辑: 我在setq之前和之后添加了格式函数,输出如下:
Cur: (1 7 8 14)
Solution: ((1 7 8 14))
Cur: (2 4 11 13)
Solution: ((1)(2 4 11 13))
在整个事情完成后,返回的值再次变为((1) (2))
。我并没有真正做任何修改solution
...
答案 0 :(得分:2)
看起来你的错误就在其他地方。
<强>样式:强>
我会像这样编写/格式化代码:
(defun add-solution (n)
(do ((solution nil)
(current-node '() (next-state current-node n nil)))
((equal current-node '(0 0 0 0)) solution)
(when (goal-test current-node n)
(setq solution (append solution (list current-node))))))
请注意,这是错误代码,因为您在循环中 APPENDING 项目到列表末尾。这可能是非常昂贵的操作。 Lisp列表经过优化,可以添加到前端,而不是最后。