在公共lisp中使用递归方法

在公共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

这是三个连接在它们之间的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))
        (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)))))