如何在常见的lisp中创建具有奇数和偶数对的单个列表中的列表列表

时间:2015-03-28 07:58:59

标签: 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") )

所以总是会生成子列表,其值为((第一秒)(第三个第四)(第五个第六个)............)

我尝试了多种方法,比如首先取出奇数项甚至项目分开并使用函数(列表(奇数列表偶数列表))但未达到上述ListB中的预期值。有人请在这方面帮助我。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您需要制作一个执行以下操作的程序:

  1. 当参数为()时处理。通常结果是()
  2. 默认情况下你处理一个两个链。例如。 (cons (list "a" "b") recursive-call-here)
  3. 因此'("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)

首先出现的是evenlistoddlist,取决于您是从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))