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