gpt4 book ai didi

functional-programming - Lisp - 在 n 个列表中拆分列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:22 25 4
gpt4 key购买 nike

我想不出如何平均拆分列表,例如这个列表:

(("6" "S") ("7" "S") ("8" "S") ("9" "S") ("10" "S") ("J" "S") ("K" "S")
("A" "S") ("6" "C") ("7" "C") ("8" "C") ("9" "C") ("10" "C") ("J" "C")
("Q" "C") ("K" "C") ("A" "C") ("6" "H") ("7" "H") ("8" "H") ("9" "H")
("10" "H") ("J" "H") ("Q" "H") ("K" "H") ("A" "H")("6" "D") ("7" "D")
("8" "D") ("9" "D") ("10" "D") ("J" "D") ("Q" "D") ("K" "D"))

分成 n 个列表,例如分成 3 个或 4 个,具体取决于需要分成多少。如果在 3 个列表中,则应返回的列表应如下所示:

(("6" "S") ("7" "S") ("8" "S") ("9" "S") ("10" "S") ("J" "S") ("K" "S")
("A" "S") ("6" "C") ("7" "C") ("8" "C") ("9" "C"))
(("10" "C") ("J" "C") ("Q" "C") ("K" "C") ("A" "C")("6" "H") ("7" "H")
("8" "H") ("9" "H") ("10" "H") ("J" "H") ("Q" "H"))
(("K" "H") ("A" "H")("6" "D") ("7" "D") ("8" "D") ("9" "D") ("10" "D")
("J" "D") ("Q" "D") ("K" "D"))

第一个列表将包含 12 个元素,第二个 12 个,第三个 11 个。

最佳答案

如果您查看方案的 take 和 drop 函数,您可以实现您想要的。例如观察这个简单的过程:

(define (splitparts lst num)
(letrec ((recurse
(lambda (lst num acc)
(if (null? lst)
acc
(recurse (drop lst num) num (append acc (list (take lst num))))))))
(recurse lst num '())))

> (splitparts '(1 2 3 4) 2)
((1 2) (3 4))
> (splitparts '(1 2 3 4 5 6 7 8) 2)
((1 2) (3 4) (5 6) (7 8))

现在的问题是,如果 take 和 drop 期望列表至少包含您请求的元素数。所以我们可以编写我们自己的版本,最多可以容纳一定数量的元素,如果他们得到的更少,他们不在乎。这是受 this thread 启发的 take 的实现。具有适当的尾递归实现

(define (takeup to lst)
(letrec ((recurse
(lambda (to lst acc)
(if (or (zero? to) (null? lst))
acc
(recurse (- to 1) (cdr lst) (append acc (list (car lst))))))))
(recurse to lst '())))

> (takeup 5 '(1 2 3))
(1 2 3)
> (takeup 5 '(1 2 3 4 5 6 7))
(1 2 3 4 5)

现在您可以在实现类似的 dropupto 函数时轻松编写 splitparts 函数。在普通的 lisp 中,你有 subseq可用于实现类似于取放功能的函数。

编辑:简单获取和删除的常见 lisp 实现(请原谅我非常不惯用的 CL)

;; recursive implemention of take just for demo purposes.
(defun takeinner (lst num acc)
(if (or (= num 0) (null lst))
acc
(takeinner (cdr lst) (- num 1) (append acc (list (car lst))))))

(defun take (lst num)
(takeinner lst num '()))

;; of course take can be implemented using subseq as drop.
(define take-alternative (lst num)
(subseq lst 0 num))

(defun drop (lst num)
(subseq lst num))

(defun splitpartsinner (lst num acc)
(if (null lst)
acc
(splitpartsinner (drop lst num) num (append acc (list (take lst num))))))

(defun splitparts (lst num)
(splitpartsinner lst num '()))

> (splitparts '(1 2 3 4) 2)
((1 2) (3 4))

这会遇到上述问题,因此您仍然必须实现最新版本。

关于functional-programming - Lisp - 在 n 个列表中拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47875185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com