Graph 从CLISP中的点列表(边)中提取节点

Graph 从CLISP中的点列表(边)中提取节点,graph,lisp,graph-theory,edge-list,land-of-lisp,Graph,Lisp,Graph Theory,Edge List,Land Of Lisp,在Lisp世界中,我是一个“零”或() 我想得到边缘列表中所有节点的列表,并编写了一个代码来解决这个问题。但是我遇到了一些意想不到的问题 (代码来自“Lisp之地”-第8章) 我编写了一个代码,将所有节点提取为如下列表 ;; 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) (

在Lisp世界中,我是一个“零”或() 我想得到边缘列表中所有节点的列表,并编写了一个代码来解决这个问题。但是我遇到了一些意想不到的问题

(代码来自“Lisp之地”-第8章)

我编写了一个代码,将所有节点提取为如下列表

;; 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)" 
堆栈溢出? 我认为这是由我的代码中的递归函数引起的。
如何正确修复此问题?

您的递归
addNode
(如果您是lisper,最好称为
addNode
)需要一个停止条件。 例如:

请注意,这里没有理由使用递归,简单的

(defun extract-nodes (el)
  (mapcar #'car el))

addNode什么时候停止?我知道了。我的addNode函数永远不会结束。
         (add-node (edge-list)
           (push (car (pop edge-list)) nodes)
           (when edge-list
             (add-node (cdr edge-list))))
(defun extract-nodes (el)
  (mapcar #'car el))