在LISP中反转列表的前n个元素

jan*_*vdl 0 lisp reverse list

假设我有一个名为"numbers"的列表(3 1 4 5 2).我正在寻找一个命令,它将列表从索引0反转到任意索引,即(反向数字2),它将新列表作为(4 1 3 5 2).

我试过谷歌搜索,但找不到合适的功能,我在这个阶段自己编写这个功能太多了.

谢谢.

sds*_*sds 6

基于libary函数的简单CL版本:

(defun reverse-first-n (list n)
  (nreconc (subseq list 0 n) (nthcdr n list)))
Run Code Online (Sandbox Code Playgroud)
  1. 这是内存最优的,即它不会不必要地分配:
    • 无需复制尾部,因此nthcdr而不是subseq
    • revappend复制第一个参数,无论如何都是新的列表,因此nreconc更经济.
  2. 这个版本速度不是最理想的,因为它遍历list到n第3个位置- 一次进入subseq,一次进入nthcdr,然后一次进入nreconc.

这是最佳的版本:

(defun reverse-first-n (list n)
  (if (or (= n 0) (= n 1))
      list
      (do* ((tail (list (pop list)))
            (head tail (cons (pop list) head))
            (count (1- n) (1- count)))
           ((zerop count)
            (setf (cdr tail) list)
            head))))
Run Code Online (Sandbox Code Playgroud)

请注意,这是代码中性能瓶颈的可能性很小.我提供第二个版本的主要目的是展示广泛且精心设计的CL库为您节省多少时间和精力.