gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:01 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

关于graph - 在 CLISP 中提取节点形成虚线列表(边),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28144116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com