我将尝试找出一种能够实现以下功能的算法:
算法将接收到像这样的列表:
((start a b c) (d e f (start g h i) (j k l) (end)) (end) (m n o))
接下来,它会将包含元素start的列表与包含元素end的列表之前的所有列表连接起来。最后返回的列表应该如下所示:
((start a b c (d e f (start g h i (j k l)))) (m n o))
该算法必须能够处理包含start的列表,这些列表也可能包含其他的start。
编辑:
现在我有这个:
(defun conc-lists (l)
(cond
((endp l) '())
((eq (first (first l)) 'start)
(cons (cons (first (first l)) (conc-lists (rest (first l)))))
(conc-lists (rest l)))
((eq (first (first l)) 'end) '())
(t (cons (first l) (conc-lists (rest l))))))
但是它没有起作用。也许我应该列出或添加而不是 consing?
编辑2:
上面的程序不应该工作,因为我正在尝试从非列表中获取第一个元素。到目前为止,这是我想出来的:
(defun conc-lists (l)
(cond
((endp l) '())
((eq (first (first l)) 'start)
(append (cons (first (first l)) (rest (first l)))
(conc-lists (rest l))))
((eq (first (first l)) 'end) '())
(t (cons (first l) (conc-lists (rest l))))))
这是我得到的结果:
(conc-lists ((START A B C) (D E F (START G H I) (J K L) (END)) (END) (M N O)))
1. Trace: (CONC-LISTS '((START A B C) (D E F (START G H I) (J K L) (END)) (END) (M N O)))
2. Trace: (CONC-LISTS '((D E F (START G H I) (J K L) (END)) (END) (M N O)))
3. Trace: (CONC-LISTS '((END) (M N O)))
3. Trace: CONC-LISTS ==> NIL
2. Trace: CONC-LISTS ==> ((D E F (START G H I) (J K L) (END)))
1. Trace: CONC-LISTS ==> (START A B C (D E F (START G H I) (J K L) (END)))
(START A B C (D E F (START G H I) (J K L) (END)))
(t (cons (first l) (conc-lists (rest l))))
:你需要在(first l)
上递归调用conc-lists
,这样(first l)
内部的(start)
子列表才会被处理。另一个bug是当你到达一个(end)
时,你停止了递归;而可能还有更多的元素跟在(end)
后面,它们将会丢失。因为在当前嵌套级别已经看到(start)
时,对(start)
和(end)
的处理是不同的,所以我认为你应该有两个递归函数,而不是一个。(请参见我的答案中的示例。) - Alex D