递归拆分列表函数 LISP

Bry*_*lie 5 lisp recursion split list common-lisp

split-list 函数接受一个列表并返回由输入的交替元素组成的两个列表的列表。我写了以下内容:

(defun split-list (L)
  (cond
      ((endp L) (list NIL  NIL))
      (t (let ((X (split-list (cdr L))))
         (cond
             ((oddp (length L))
              (list (cons (first L) (first X)) (cadr X)))
             (t (list (first X) (cons (first L) (cadr X)))))))))
Run Code Online (Sandbox Code Playgroud)

输出与奇数列表一样,第一个列表由第 1、第 3、第 5 等元素组成,第二部分由第 2、第 4、第 6 等元素组成。然而,对于偶数列表,第 1、第 2、第 3 个。 . 位于返回列表的右侧,其余位于左侧。

例如:

(SPLIT-LIST '(a b c 1 2 3))
(SPLIT-LIST RETURNED ((b 1 3) (a c 2))
Run Code Online (Sandbox Code Playgroud)

应该交换顺序。我的逻辑是否存在重大缺陷,我遗漏了?我可以在不进行重大更改的情况下纠正这种情况吗?

Dou*_*rie 5

是的,您无需进行重大修改即可纠正问题。

  1. 添加一个案例 (endp (cdr L))
  2. 进行递归调用 cddr L
  3. 之后,else 情况将始终有两个新元素,一个是 cons 到每个列表中;不再需要length电话