【发布时间】:2022-02-23 14:58:52
【问题描述】:
示例:
如何转换列表:
'(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
进入列表列表:
'((0 1 2 3) (4 5 6 7) (8 9 10 11) (12 13 14 15))
根据到目前为止提供的答案,这是我想出的:
首先定义函数以从列表的开头最多占用“n”个元素:
(define (take-up-to n xs)
(define (iter xs n taken)
(cond
[(or (zero? n) (empty? xs)) (reverse taken)]
[else (iter (cdr xs) (- n 1) (cons (car xs) taken))]))
(iter xs n '()))
第二个是列表其余部分的类似功能:
(define (drop-up-to n xs)
(define (iter xs n taken)
(cond
[(or (zero? n) (empty? xs)) xs]
[else (iter (cdr xs) (- n 1) (cons (car xs) taken))]))
(iter xs n '()))
这可以作为一个返回两个值的函数来完成,而 Racket 有一个产生相同结果的函数“split-at”,但我这样做是为了练习。
ps。这是正确使用尾递归吗?
分割成块可以这样写:
(define (split-into-chunks n xs)
(if (null? xs)
'()
(let ((first-chunk (take-up-to n xs))
(rest-of-list (drop-up-to n xs)))
(cons first-chunk (split-into-chunks n rest-of-list)))))
pps。可以进一步改进还是“足够好”?
【问题讨论】:
-
您需要更具体:列表的数量或每个列表的(近似)大小是如何确定的?
-
由于我是 Racket 的新手,我对遍历列表和递归背后的一般原则更感兴趣,但我现在真正需要的是:我想制作 4 字节块的列表长度总是 4 的倍数的大字节列表(因此没有“剩余”)。
-
块是 RGBA 值。块数约为 100.000 如果有比列表列表更好的结构,例如这样,请随时推荐!向量,字节可能?
-
可能会有更好的数据结构,是的。哪个最好取决于您希望用它做什么,但是向量是一个候选者,字节字符串是另一个候选者;您还可以使用 Racket 的记录类型支持将每个像素表示为记录,并具有像素列表或向量。