3

它来自我的家庭作业。有一个家谱

                             a  +  b
                         /   |    |   \ 
                        c+u  d+c  e+w  f
                     / | \        / \
                 m+x  n+y  o      p  q
                  |
                  r

a 和 b 是最老的。而且每一个已婚的人第二个人都不属于原来的家庭。现在我需要写配偶,兄弟姐妹,孩子,孙子,父母和祖父母的功能。

我写的清单如下: ((父亲母亲)chlid1 child2 child3)

(((a b) c d e f) ((c u) m n o) ((d v) nil) ((e w) p q) (f nil) ((m x) r) ((n y) nil) (o nil) (p nil) (q nil)  )

我对兄弟函数有一些问题,这是我的代码。

(defun sibling  (arglst lst)  
 (cond
        ((eql 
             arglst (cdr (car lst))) 
                 (rest (cdr lst))
         )
   (T (sibling (rest lst) arglst))

)

我知道这是错误的,但我不知道如何修改它......而且我还需要一些其他功能的帮助。希望能从你们那里得到一些提示。

4

2 回答 2

1

由于这是家庭作业,我不会给出完整的解决方案,但这应该足以让您解决其余的问题:

(defparameter *family* '(((a b) c d e f)
                         ((c u) m n o)
                         ((d v) nil)
                         ((e w) p q)
                         (f nil)
                         ((m x) r)
                         ((n y) nil)
                         (o nil)
                         (p nil)
                         (q nil)))

(defun siblings (person family)
  "Return a list of PERSON's siblings."
  (remove person (cdr (find person family :key #'cdr :test #'member))))

(defun siblingsp (person1 person2 family)
  "Are PERSON1 and PERSON2 siblings?"
  (find person2 (siblings person1 family)))

(defun parents (person family)
  "Return a list of PERSON's parents."
  (car (find person family :key #'cdr :test #'member)))

(defun parentp (parent child family)
  "Is PARENT a parent of CHILD?"
  (find parent (parents child family)))

尝试一下:

CL-USER> (siblings 'p *family*)
(Q)
CL-USER> (siblingsp 'q 'p *family*)
P
CL-USER> (parents 'p *family*)
(E W)

现在,以查找祖父母为例,您只需要了解祖父母是什么:​​(列表)父母双方的父母。然后,问问自己对孙子孙女的看法。最后,spouse给定这个例子,这个函数应该相当简单。

于 2011-09-15T08:44:33.403 回答
0

例如,我不知道为什么它只能返回一级和二级。a 返回 b, c 返回 u。但是当我输入m时,它返回一个错误:

- MEMBER: A proper list must not end with F.

我检查了代码,没有发现任何问题。为什么它不能搜索第三级?但是它可以找到孙子,所以我想如果它可以搜索孙子,为什么它不能搜索配偶?功能有问题Member吗?无论如何,您的代码非常简单,易于阅读和理解。非常感谢。

(defun spouse ( family-tree2 person) ;Find person's spouse
   (remove person (car (find person family-tree2 :key #'car :test #'member)))
);end
于 2011-09-17T01:06:52.423 回答