gpt4 book ai didi

lisp - 在common-lisp中转向递归方法

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:46 25 4
gpt4 key购买 nike

这是 3 个相互连接的井字游戏板的坐标,我想知道如何减少此代码,使其以递归方式实现。下面的所有代码只是一种方法 (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

最佳答案

这是一个可能的解决方案,其中生成了坐标。每个 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)))))

关于lisp - 在common-lisp中转向递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997105/

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