递归函数,在lisp中左右旋转列表的n个元素

时间:2016-03-22 18:37:59

标签: list lisp common-lisp

该函数有1个参数,一个整数。 例如,rot-left(2 '(1 2 3 4 5))应该返回(3 4 5 1 2 )rot-right(2 '(1 2 3 4 5))应该返回(5 4 1 2 3)

我已经尝试过了......它不起作用,但它应该做的是将列表的最后n个元素添加到空列表中。

(defun rot_left (n l)
  (if (zerop n)
      '()
      (append (last l)
              rot-left ((- n 1) (cdr l)))))

1 个答案:

答案 0 :(得分:0)

我将给出一个解决方案,假设如果函数rot-right应该从右向左旋转列表的元素,(rot-right 2 '(1 2 3 4 5))应该生成(4 5 1 2 3)而不是(5 4 1 2 3)

然后,假设这种解释是正确的,只能通过Common Lisp中的原始运算符编写函数,而不使用迭代或递归:

(defun rot-left(n l)
  (append (nthcdr n l) (butlast l (- (length l) n))))

(defun rot-right(n l)
  (rot-left (- (length l) n) l))

(defvar a '(1 2 3 4 5))

(rot-left 2 a)   ;  produces (3 4 5 1 2)
(rot-right 2 a)  ;  produces (4 5 1 2 3)