在公共lisp中使用递归方法
这是三个连接在它们之间的tic-tac-toe板的坐标,我想知道如何通过递归的方式减少这段代码。 以下所有代码仅为一种方法(vitoria): 位置1-3中级别之间的列在公共lisp中使用递归方法,lisp,common-lisp,Lisp,Common Lisp,这是三个连接在它们之间的tic-tac-toe板的坐标,我想知道如何通过递归的方式减少这段代码。 以下所有代码仅为一种方法(vitoria): 位置1-3中级别之间的列 (verificacaoXO (get-elem 2 1 1 tabuleiro) (get-elem 2 1 2 tabuleiro) (get-elem 2 1 3 tabuleiro)) (v
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 2 1 3 tabuleiro))
(verificacaoXO (get-elem 2 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 2 3 tabuleiro))
(verificacaoXO (get-elem 2 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 2 3 3 tabuleiro))
位置2-6中级别之间的列
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 1 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 3 2 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 3 3 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
位置3-9中级别之间的列
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))
顶部标高之间的线-11
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 3 3 tabuleiro))
(verificacaoXO (get-elem 2 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 1 3 tabuleiro))
介于中间水平的13~/P>
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
底部标高之间的线-15
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))
水平之间的对角线-19
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 1 2 1 tabuleiro)
(get-elem 1 3 1 tabuleiro))
(verificacaoXO (get-elem 2 1 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 2 3 1 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 3 2 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
1-22层的线路
(verificacaoXO (get-elem 1 1 2 tabuleiro)
(get-elem 1 2 2 tabuleiro)
(get-elem 1 3 2 tabuleiro))
(verificacaoXO (get-elem 2 1 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 2 3 2 tabuleiro))
(verificacaoXO (get-elem 3 1 2 tabuleiro)
(get-elem 3 2 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
第2-25层的线路
(verificacaoXO (get-elem 1 1 3 tabuleiro)
(get-elem 1 2 3 tabuleiro)
(get-elem 1 3 3 tabuleiro))
(verificacaoXO (get-elem 2 1 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 2 3 3 tabuleiro))
(verificacaoXO (get-elem 3 1 3 tabuleiro)
(get-elem 3 2 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
第3-28层的线路
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 1 1 tabuleiro)
(get-elem 3 1 1 tabuleiro))
(verificacaoXO (get-elem 1 2 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 2 1 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 3 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
第1-31级上的列
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 3 1 2 tabuleiro))
(verificacaoXO (get-elem 1 2 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 2 2 tabuleiro))
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
2-34级栏
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 1 3 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 1 2 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 3 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
3-37级栏
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 3 1 tabuleiro))
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 2 1 tabuleiro)
(get-elem 3 1 1 tabuleiro))
标高1-39的对角线
(verificacaoXO (get-elem 1 1 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 3 2 tabuleiro))
(verificacaoXO (get-elem 1 3 2 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 1 2 tabuleiro))
标高2-41的对角线
(verificacaoXO (get-elem 1 1 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 1 3 3 tabuleiro)
(get-elem 2 2 3 tabuleiro)
(get-elem 3 1 3 tabuleiro))
标高3-43的对角线
(verificacaoXO (get-elem 1 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 3 3 3 tabuleiro))
(verificacaoXO (get-elem 3 3 1 tabuleiro)
(get-elem 2 3 2 tabuleiro)
(get-elem 1 3 3 tabuleiro))
右侧标高之间的列-45
(verificacaoXO (get-elem 1 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 3 2 3 tabuleiro))
(verificacaoXO (get-elem 3 2 1 tabuleiro)
(get-elem 2 2 2 tabuleiro)
(get-elem 1 2 3 tabuleiro))
中间层之间的列-47
(verificacaoXO (get-elem 1 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 3 1 3 tabuleiro))
(verificacaoXO (get-elem 3 1 1 tabuleiro)
(get-elem 2 1 2 tabuleiro)
(get-elem 1 1 3 tabuleiro))))
中间-49层之间的列是一种可能的解决方案,其中生成了坐标。每个
点
由三个整数坐标组成,用于标识行、列和平面。triple
是由三个点组成的集合,用于确定一条直线。三元组从一个点开始生成,并添加两次方向(类似于(0 1 0)
)的向量)。无效的三元组将被删除
(defun valid-coordinate(c)
(<= 1 c 3))
(defun valid(triple)
(loop for point in triple always (every #'valid-coordinate point)))
(defun add(point direction)
(mapcar #'+ point direction))
(defun make-triple(point direction)
(let ((pv (add point direction)))
(list point pv (add pv direction))))
(defun make-triples(point directions)
(loop for d in directions
as triple = (make-triple point d)
when (valid triple)
collect triple))
(defun make-all-triples ()
(let ((directions-on-plane '((0 1 0)(1 0 0)(1 1 0)(-1 -1 0)))
(3d-directions '((0 0 1)(0 1 1)(1 0 1)(1 1 1)(-1 0 1)(0 -1 1)(-1 -1 1)(1 -1 1)(-1 1 1))))
(nconc (loop for plane from 1 to 3
nconc (loop for r from 1 to 3
nconc (loop for c from 1 to 3
nconc (make-triples (list r c plane) directions-on-plane))))
(loop for r from 1 to 3
nconc (loop for c from 1 to 3
as plane = 1
nconc (make-triples (list r c plane) 3d-directions))))))
(defun vitoria (tabuleiro)
(loop for triple in (make-all-triples)
thereis (apply #'verificacaoXO (loop for (r c plane) in triple
collect (get-elem r c plane tabuleiro)))))
(取消有效坐标(c)
(为什么要使用递归?为什么不使用循环,例如,或者。这是一个3d tic tac toe吗?verificacaoXO
在做什么?vitoria-defun方法中的verificacaoXO应该是有效坐标吗?valid坐标
只是一个检查坐标是1、2还是3的函数。verificacaoXO
是一个调用chec的函数。)k(我想)如果一个三元组对一个玩家来说是赢的。我的解决方案生成所有有效的三元组(即具有有效坐标的三元组),然后对每个三元组应用verificacaoXO
对三元组点上的get elem
的三次调用返回的内容。
(defun valid-coordinate(c)
(<= 1 c 3))
(defun valid(triple)
(loop for point in triple always (every #'valid-coordinate point)))
(defun add(point direction)
(mapcar #'+ point direction))
(defun make-triple(point direction)
(let ((pv (add point direction)))
(list point pv (add pv direction))))
(defun make-triples(point directions)
(loop for d in directions
as triple = (make-triple point d)
when (valid triple)
collect triple))
(defun make-all-triples ()
(let ((directions-on-plane '((0 1 0)(1 0 0)(1 1 0)(-1 -1 0)))
(3d-directions '((0 0 1)(0 1 1)(1 0 1)(1 1 1)(-1 0 1)(0 -1 1)(-1 -1 1)(1 -1 1)(-1 1 1))))
(nconc (loop for plane from 1 to 3
nconc (loop for r from 1 to 3
nconc (loop for c from 1 to 3
nconc (make-triples (list r c plane) directions-on-plane))))
(loop for r from 1 to 3
nconc (loop for c from 1 to 3
as plane = 1
nconc (make-triples (list r c plane) 3d-directions))))))
(defun vitoria (tabuleiro)
(loop for triple in (make-all-triples)
thereis (apply #'verificacaoXO (loop for (r c plane) in triple
collect (get-elem r c plane tabuleiro)))))