从另一个列表,方案中形成每个第n个元素的新列表

时间:2015-11-23 00:47:56

标签: list scheme

可能很明显的快速问题。

如何从另一个列表中形成每个 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))))

感谢您的任何建议!

1 个答案:

答案 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)