前言:我目前考虑的是在LISP显然教冷凝当然,我从来没有在我的生活LISP工作,所以我必须学会在语言周末。我提前为严重的代码道歉。我只是熟悉LISP的语法来获得代码的工作,而不是更多。的Common Lisp(SBCL):从内部返回值循环
我目前正在上解决了地图着色问题的程序。此代码采用一个序列,其中每个子序列的第一个元素是一个状态,第二个元素表示一个颜色。例如:“((A R)(B G)(C G)(d Y)(E B)(F B)),然后进行检查以确保没有状态具有的颜色,因为它是由约束的状态下(由约束列表中定义的)相同。我知道可能有很多更干净更简单的方法来做到这一点,但是我现在正在努力的是让我的dolist循环在if语句满足时立即返回值T.到目前为止,我一直无法得到的功能只返回一个值,而不得不求助于变量设置为true,并等待循环,以便使代码工作完成的这实在是太丑/错误的方法。我已经尝试过使用return并且只在if语句内部有T,但是在这两种情况下,循环都会完成而不是返回一个值,我不知道为什么。
(setq constraint '((A (B C E)) (B (A E F)) (C (A E F)) (D (F)) (E (A B C F)) (F (B C D E))))
(defun check_constraint (f s)
(setf ans nil)
(dolist (state constraint)
(if (eq (first state) f)
(if (search (list s) (second state))
(setf ans T) ;;where I want it to just return T
)
)
)
ans
)
;;ex: ((A R) (B R) (C B) (D R) (E B) (F G))
(defun check_conflict (lst)
(setf anb nil)
(dolist (state lst)
(dolist (neighbor (remove state lst))
(if (check_constraint (first state) (first neighbor))
(if (eq (second state) (second neighbor))
(setf anb T)) ;;where I want it to just return T
)
)
)
anb
)
编辑:我结束了刚刚修复这与递归。现在的代码更清洁,但我仍然很想知道我的问题是什么。这是递归代码。
(setq constraint '((A (B C E)) (B (A E F)) (C (A E F)) (D (F)) (E (A B C F)) (F (B C D E))))
(defun check_constraint (lst f s)
(COND
((null lst) nil)
((search (list (car (car lst))) f)
(if (search s (second (car lst))) T))
(t (check_constraint (cdr lst) f s))
)
)
(defun check_neighbor (check lst)
(COND
((null lst) nil)
((check_constraint constraint (list (car check)) (list (first (first lst))))
(if (eq (second check) (second (car lst))) T))
(t (check_neighbor check (cdr lst)))
)
)
;;(check_state '((A R) (B R) (C B) (D R) (E B) (F G)))
(defun check_state (lst)
(COND
((null lst) nil)
((check_neighbor (car lst) (cdr lst)) T)
(t (check_state (cdr lst)))
)
)
有很多口齿不清方言的,你不说哪个。在大多数方言中,都有一个特殊的形式'return',可以用来从更高层次的形式返回一个值。不幸的是,它适用于哪种形式是方言之间不同的事情之一。因此,在那一点上使用'(return T)'可以处理我所知道的大多数方言[并且可以避免使用变量'ans'和'anb',并且在循环之后只有'NIL']。 – MAP
@MAP这是常见的lisp,试图说明,我无法在SBCL中使用它。 – Metasyntactic