Lisp 有人能给我一些关于这个问题(家谱)的提示吗?
它来自我的家庭作业。有一棵家谱Lisp 有人能给我一些关于这个问题(家谱)的提示吗?,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,它来自我的家庭作业。有一棵家谱 a + b / | | \ c+u d+c e+w f / | \ / \ m+x n+y o p q |
a + b
/ | | \
c+u d+c e+w f
/ | \ / \
m+x n+y o p q
|
r
a和b是最老的。而每一个已婚的人,第二个人都不是原来家庭的一部分。
现在我需要编写配偶、兄弟姐妹、子女、孙子女、父母和祖父母函数
我写的清单如下:
((父亲母亲)孩子1孩子2孩子3)
我对同级函数有一些问题,下面是我的代码
(defun sibling (arglst lst)
(cond
((eql
arglst (cdr (car lst)))
(rest (cdr lst))
)
(T (sibling (rest lst) arglst))
)
我知道它错了,但我不知道如何修改它。。我还需要一些其他功能的帮助。希望你们能给我一些提示 因为这是家庭作业,我不会给出完整的解决方案,但这应该足以让您解决其余问题:
(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)
比如说,要找到祖父母,你只需要了解什么是祖父母(父母双方的父母列表)。然后,问问你自己,这对孙子孙女们有什么好处。最后,考虑到这个例子,
配偶
函数应该相当简单。我不知道为什么它只能返回第一级和第二级。a返回b,c返回u。但当我输入m时,它返回一个erro:
-成员:正确的列表不能以F结尾
我检查了代码,没有发现任何问题。为什么它不能搜索第三级?但它可以找到孙子,所以我想如果它可以做孙子搜索,为什么它不能做配偶搜索呢?成员
功能是否有问题?总之,您的代码非常简单,易于阅读和理解。非常感谢
(defun spouse ( family-tree2 person) ;Find person's spouse
(remove person (car (find person family-tree2 :key #'car :test #'member)))
);end
顺便说一句:还以这个为例,介绍如何格式化Lisp代码,特别是如何缩进、放置参数以及如何命名变量和参数。是否有什么不清楚的地方,或者您不理解的地方?是的,非常有用,我今天刚刚完成。有一件事我不能解决。关于配偶功能。问题是,在
配偶
到达((mx)r)
之前,它处理(f nil)
,其中f
不是一个列表<代码>成员被它卡住了。试着测试一下,列表的第一个元素是列表,还是像这样更改未婚者的表示:((f)nil)
。(另一件事:不要在他们自己的行上加上右括号。这需要一点时间来适应,但其他Lisp程序员希望您的代码看起来有一定的方式。一个是读取缩进,而不是括号。使用具有适当paren匹配的编辑器。还有:为什么家族树2
而不仅仅是家族树
或家庭
?)谢谢,我想我明白了。家谱是我的老师给我的一个恒量。
(defun spouse ( family-tree2 person) ;Find person's spouse
(remove person (car (find person family-tree2 :key #'car :test #'member)))
);end