List 从另一个列表中形成每n个元素的新列表,scheme

List 从另一个列表中形成每n个元素的新列表,scheme,list,scheme,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)) 我如何形成一个新的列表,比如说,字母表中的第二个元素 我想使用list ref,但不确定如何正确遍历列表 我是这样想的: (define (build

可能是显而易见的快速问题

如何从另一个列表中形成每个第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))
我如何形成一个新的列表,比如说,字母表中的第二个元素

我想使用
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))))

谢谢你的建议

使用
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)

下面是另一种解决方案

要获得每一个,比如说,第五个元素:保留第一个元素,跳过接下来的四个元素, 然后重复

#lang racket

(define (drop n xs)
  (if (or (= n 0) (empty? xs))
      xs
      (drop (- n 1) (cdr xs))))

(define (every-nth n xs)
  (if (empty? xs)
      '()
      (cons (first xs)
            (every-nth n (drop n xs)))))

;; Examples:
> (every-nth 3 '(1 2 3 4 5 6 7 8 9))
'(1 4 7)
> (every-nth 3 '(1 2 3 4 5 6 7 8 9 10))
'(1 4 7 10)

有没有一种方法可以使用过滤器?我想象它像
(filter(((mod counter++n)0))字母表)
,但那不是真正的代码。“筛选器似乎需要一个函数来获取列表项,一方面。@TessellingEckler当然,通过跟踪索引并筛选我们需要的索引,这是可能的。”。但这是人为的,不值得去做。