它来自我的家庭作业。有一个家谱
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))
)
我知道这是错的,但我不知道如何修改它...我还需要一些其他功能的帮助。希望可以得到你们的一些提示。
答案 0 :(得分: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
函数应该相当容易。
答案 1 :(得分: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