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)
你认为它更有效_首先删除重复项并排序可能更短的列表? –
+1,但有两件事:(1)为什么在这种情况下稳定排序?与w.r.t相等的数字部分命令' coredump
@coredump'stable-sort'总是做对的事情。如果你只使用一个排序功能,这是一个。我同意'delete-duplicates' – Sylwester