转向common-lisp中的递归方法

时间:2015-11-30 11:03:45

标签: lisp common-lisp

这是连接在它们之间的3个tic tac toe板的坐标,我想知道如何以递归方式减少这个代码。 以下所有代码只是一种方法(vitoria):

(defun vitoria (tabuleiro)
    (or (verificacaoXO (get-elem 1 1 1 tabuleiro)
                         (get-elem 1 1 2 tabuleiro)
                         (get-elem 1 1 3 tabuleiro))
        (verificacaoXO (get-elem 1 2 1 tabuleiro)
                         (get-elem 1 2 2 tabuleiro)
                         (get-elem 1 2 3 tabuleiro))
        (verificacaoXO (get-elem 1 3 1 tabuleiro)
                         (get-elem 1 3 2 tabuleiro)
                         (get-elem 1 3 3 tabuleiro)) 

位置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

       (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

1 个答案:

答案 0 :(得分:1)

这是一种可能的解决方案,其中生成坐标。每个point由三个整数坐标组成,用于标识行,列和平面。 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)))))