我在Lisp World中是“Nil”或() 我想得到边列表中所有节点的列表,我写了一个代码来解决这个问题。但我遇到了一些意想不到的问题
(来自'Land of Lisp'的代码 - 第8章)
;; Creating edge list
(defun random-node ()
(1+ (random *node-num*)))
(defun edge-pair (a b)
(unless (eql a b)
(list (cons a b) (cons b a))))
(defun make-edge-list ()
(apply #'append (loop repeat *edge-num*
collect (edge-pair (random-node) (random-node)))))
(defparameter el (make-edge-list))
我编写了一个代码来将所有节点提取为如下所示的列表。
;; el : list of dotted list
;; I want to extract all the first element from every dotted lists in el.
;; el : ((25 . 6) (6 . 25) (2 . 13) (13 . 2) (25 . 16) (16 . 25) ....)
;; What I want to get: (25 6 2 13 25 16 ... )
(defun extract-nodes (el)
(let ((nodes nil))
(labels ((addNode (edgeList)
(push (caar edgeList) nodes)
(addNode (cdr edgeList))))
(addNode el))
nodes))
我认为我的代码并不是那么糟糕,但结果却给我一个令人尴尬的错误信息。
"Stack overflow (deep)"
堆栈溢出? 我认为它是由我的代码中的递归函数引起的。 我该如何妥善解决这个问题?
感谢。
答案 0 :(得分:2)
您的递归addNode
(如果您是lisper,最好称为add-node
)需要停止条件。
如,
(add-node (edge-list)
(push (car (pop edge-list)) nodes)
(when edge-list
(add-node (cdr edge-list))))
请注意,这里没有理由使用递归,简单的mapcar
就可以了:
(defun extract-nodes (el)
(mapcar #'car el))