可能很明显的快速问题。
如何从另一个列表中形成每个 n 元素的新列表?
例如,假设我有这个清单:
(define alphabet '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z))
如何在alphabet
中每隔一个元素形成一个新的说明列表?
我想使用list-ref
,但我不确定如何正确地遍历列表。
我在想这样的事情:
(define (build-list alphabet output-list count temp-count limit)
(cond
((= temp-count limit) output-list)
(else (define new-list (append output-list (list-ref alphabet count))) (build-list alphabet output-list (+ count 2) (+ temp-count 1) limit))))
感谢您的任何建议!
答案 0 :(得分:1)
使用list-ref
并不是一个好主意,你最终会超越绝对必要的遍历列表,如果我们使用索引对我们有利,那就更好了。试试这个:
(define (build-list alphabet count limit)
(cond ((null? alphabet) '())
((= count limit)
(cons (car alphabet)
(build-list (cdr alphabet) 1 limit)))
(else
(build-list (cdr alphabet) (+ count 1) limit))))
例如,要包含第一个元素的每第二个元素取一个元素,请执行以下操作:
(build-list alphabet 2 2) ; set count and limit to the same value
=> '(#\A #\C #\E #\G #\I #\K #\M #\O #\Q #\S #\U #\W #\Y)
要跳过第一个元素并从那里开始,每隔一个元素:
(build-list alphabet 1 2) ; set count to 1
=> '(#\B #\D #\F #\H #\J #\L #\N #\P #\R #\T #\V #\X #\Z)
输出整个列表:
(build-list alphabet 1 1) ; set count to 1 and limit to 1
=> '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\J #\K #\L #\M
#\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z)