我是Lisp编程的新手,并尝试从lisp中的单个列表创建子列表,其中包含奇数和偶数列表。例如: 我有一个清单
ListA ("a" "b" "c" "d" "e" "f" "g" "h")
现在我想转换成以下列表:
enter code here
ListB ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") )
所以总是会生成子列表,其值为((第一秒)(第三个第四)(第五个第六个)............)
我尝试了多种方法,比如首先取出奇数项甚至项目分开并使用函数(列表(奇数列表偶数列表))但未达到上述ListB中的预期值。有人请在这方面帮助我。非常感谢您的帮助。
答案 0 :(得分:1)
您需要制作一个执行以下操作的程序:
(cons (list "a" "b") recursive-call-here)
因此'("g" "h")
的结果变为(cons (list "g" "h") ())
,如果您将其添加到recursive-call-here,那么您最终会得到:
(cons (list "a" "b")
(cons (list "c" "d")
(cons (list "e" "f")
(cons (list "g" "h") ()))))
; ==> (("a" "b") ("c" "d") ("e" "f") ("g" "h"))
答案 1 :(得分:1)
循环:
实际上非常短(loop for (x y) on '(a b c d e f) by #'cddr
collect (list x y))
;=> ((A B) (C D) (E F))
如果您的元素数量奇数,这确实会在最后一对中给您一个NIL,但您没有提到在这种情况下会发生什么:
(loop for (x y) on '(a b c d e f g ) by #'cddr
collect (list x y))
;=> ((A B) (C D) (E F) (G NIL))
答案 2 :(得分:0)
如果您已经将偶数元素与奇数元素分开,那么下一步将是:
(mapcar #'list evenlist oddlist)
首先出现的是evenlist
或oddlist
,取决于您是从0还是1开始计算。
或者,可以使用单个loop
表达式解决整个问题:
(loop for head = '(a b c d e f g h i j k l m n o p) then (cddr head)
until (null head)
if (= (length head) 1) collect head
else collect (subseq head 0 2))