我需要编写一个递归函数,它会打印两次列表的元素。例如,rdouble'(1 2 3)将打印(1 1 2 2 3 3)并且rdouble'(1(2 3)4)将打印(1 1(2 2 3 3)4 4)。
到目前为止,我有:
(defun rdouble(struct)
(cond
((atom struct) struct)
(t (cons (rdouble (car struct)) (cons (car struct)
(rdouble (cdr struct))
)))))
这适用于第一个示例,但打印
(1 1 (2 2 3 3) (2 3) 4 4)
表示第二个例子。如何继续打印每个元素两次但不重新打印(2 3)?我做错了什么,我该如何解决?
答案 0 :(得分:4)
该表达式有三种不同的情况:
您的代码只处理两种情况,其中第二种情况混合2和3。
答案 1 :(得分:0)
导致您遇到问题的原因是,在((1 2) 3)
{}}}的情况下,您的代码会递归到(1 2)
,而(1 1 2 2)
正确变为(1 2)
和然后添加{在car
给出(1 1 2 2)
之后{1}}(在第一次通话中成为((1 1 2 2) (1 2) ...)
最好的方法是让rdouble
始终返回一个列表,并append
将这些列表放在一起而不是cons