lisp不同长度两个列表

问题描述:

我有两个不同长度的列表有困难。lisp不同长度两个列表

(f '(8 1 2 3 23 12) '(2 9 4 6))应该返回(1 2 3 4 6 8 9 12 23)

这是我努力的代码。

(defun f (lst lst2) 
    (cond ((or(null lst) (null lst2)) 0) 
    (t (sort (cons (first lst) (cons (first lst2) (f (rest lst) (rest lst2)))) #'<)))) 

另外,你可以在lisp中处理重复吗?

我会很感激任何帮助。

这可以用标准功能轻松完成。要使两个列表中的一个使用append,但是最后一个参数是共享的,所以我使用copy-list来复制它,因为stable-sort具有破坏性。 delete-duplicates删除结果列表中的重复项。

(defun f (lst1 lst2) 
    (delete-duplicates (stable-sort (append lst1 (copy-list lst2)) #'<)))) 

(f '(8 1 2 3 23 12) '(2 9 4 6)) 
; ==> (1 2 3 4 6 8 9 12 23) 
+0

你认为它更有效_首先删除重复项并排序可能更短的列表? –

+0

+1,但有两件事:(1)为什么在这种情况下稳定排序?与w.r.t相等的数字部分命令' coredump

+0

@coredump'stable-sort'总是做对的事情。如果你只使用一个排序功能,这是一个。我同意'delete-duplicates' – Sylwester