如何在common lisp中从一个具有奇偶对的列表创建列表列表
我是Lisp编程新手,尝试从Lisp中的一个列表中创建子列表,并从列表中创建一对奇数和偶数。例如: 我有一张单子如何在common lisp中从一个具有奇偶对的列表创建列表列表,lisp,common-lisp,Lisp,Common Lisp,我是Lisp编程新手,尝试从Lisp中的一个列表中创建子列表,并从列表中创建一对奇数和偶数。例如: 我有一张单子 ListA ("a" "b" "c" "d" "e" "f" "g" "h") 现在我想转换为以下列表: enter code here ListB ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") ) 因此,始终将生成值为((第1秒)(第三四)(第五六)的子列表 我尝试了多种方法,例如先取出奇数项,甚至项目分开,并使用了函数(list(od
ListA ("a" "b" "c" "d" "e" "f" "g" "h")
现在我想转换为以下列表:
enter code here
ListB ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") )
因此,始终将生成值为((第1秒)(第三四)(第五六)的子列表
我尝试了多种方法,例如先取出奇数项,甚至项目分开,并使用了函数(list(odlist evenlist)),但在上面的列表中没有达到预期值。在这方面,有人能帮我吗。非常感谢您的帮助。您需要制定一个程序来执行以下操作:
(cons(在此处列出“a”和“b”)递归调用)
(“g”“h”)
的结果变为(cons(列出“g”“h”)())
,如果将其添加到递归调用中,则会得到:
(cons (list "a" "b")
(cons (list "c" "d")
(cons (list "e" "f")
(cons (list "g" "h") ()))))
; ==> (("a" "b") ("c" "d") ("e" "f") ("g" "h"))
如果您已经按照您的建议将偶数元素与奇数元素分开,那么下一步将是:
(mapcar #'list evenlist oddlist)
哪一个先到,evenlist
或oddlist
,取决于您是从0开始计数还是从1开始计数
或者,整个问题可以通过一个循环表达式来解决:
(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))
这实际上是非常短的循环:
(loop for (x y) on '(a b c d e f) by #'cddr
collect (list x y))
;=> ((A B) (C D) (E F))
如果元素的数目为奇数,则在最后一对中会给出零,但您没有提到在这种情况下会发生什么:
(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))
对于一个包含奇数个元素的列表,结果应该是什么?我通常不会指出拼写错误,但请注意,该语言是“Common Lisp”,而不是“Comman Lisp”,或(如“Conman Lisp”)。(虽然可能有一些骗子口齿不清)这是一个比这里需要的更复杂的循环使用。您可以通过#“cddr采集(列表x y)”(循环(x y)(a b c d e f))
,正如我在中所示。@JoshuaTaylor谢谢,我不知道循环
可以做到这一点。我已经在PLaneT上更正了我的循环宏的Racket实现,所以它也可以在那里工作。非常感谢Joshua!工作得很好。非常抱歉打错了