在CLISP中提取节点形成虚线列表(边)

我是Lisp World中的“无”或()。
我想获取边缘列表中所有节点的列表,并编写了代码来解决此问题。但是我遇到了一些意想不到的问题。

(来自“ 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)" 

堆栈溢出?我认为这是由我的代码中的递归函数引起的。如何正确解决此问题?

sds

您的递归addNodeadd-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))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章