返回lisp中列表中最长的连续数字序列



我是一个lisp新手。我试图在lisp中创建一个函数,它接收一个未排序的列表,该函数必须对列表进行排序,并返回一个具有最长数字序列的列表。示例:(2 1 8 9 3 11 10 20 12 21((1 2 3 8 9 10 11 12 20 21(->返回(8 9 10 11 12(

我不想使用排序函数,我已经创建了2个函数(在一些帮助下(来排序,但现在我不知道如何找到并返回最长的数字序列。我可以浏览列表,但是,我如何存储数字并检查一个连续数字列表是否比另一个长?

这是我对进行排序的功能

(defun sortOne (list)

(let ((ca1 (car list)) (cd1 (cdr list)))
(if (null cd1)
list
(let ((cd (sortOne cd1))) ; cd = sorted tail
(let ((ca2 (car cd)) (cd2 (cdr cd)))
(if (<= ca1 ca2)
(cons ca1 cd)
(cons ca2 (cons ca1 cd2))))))))
(defun sortAll (list)
(if (null list)
nil
(let ((s (sortOne list)))
(cons (car s) (sortAll (cdr s))))))

希望有人能帮我。

¡谢!

今晚我成功地做到了,但这肯定不是最好的解决方案,我想知道如何使用lambda函数或递归来做得更好。

(defun listilla (lista)
(setq lista (sort lista #'<))
(setq lista1 (list (car lista)))
(setq lista2 '())
(loop for i from 0 to (- (length lista) 2) do
(cond ((= (nth i lista) (- (nth (+ i 1) lista) 1))
(push (nth (+ i 1) lista) (cdr (last lista1))))
(t (push lista1 lista2)
(setq lista1 (list (nth (+ i 1) lista)))
)

)
)
(push lista1 lista2)
(setq masLargo (car lista2))
(loop for i from 1 to (- (length lista2) 2) do
(if (< (length (nth i lista2)) (length (nth (+ i 1) lista2)))
(setq masLargo (nth (+ i 1) lista2))
)
)
masLargo
)
(print (listilla '(23 15 6 5 78 4 77)))
(defun group-consecutives (l &optional (acc '()))
(cond ((null l) (nreverse acc))
((and acc (= 1 (- (car l) (caar acc)))) (consecutives (cdr l) (cons (cons (car l) (car acc)) (cdr acc))))
(t (consecutives (cdr l) (cons (list (car l)) (when acc (cons (nreverse (car acc)) (cdr acc))))))))
(defun longest-consecutive (l)
(car (sort (consecutives (sort l #'<)) #'> :key #'length)))
(longest-consecutive '(2 1 8 9 3 11 10 20 12 21)) 
;;=> (8 9 10 11 12)

第二个函数可能更容易理解,如下所示:

(defun sort-increasing (l)
(sort l #'<))
(defun sort-groups-by-length (groups)
(sort groups #'> #'length))
(defun longest-consecutive (l)
(car (sort-groups-by-length (group-consecutives (sort-increasing l))))))))

最新更新