List 从另一个列表中形成每n个元素的新列表,scheme
可能是显而易见的快速问题 如何从另一个列表中形成每个第n个元素的新列表 例如,假设我有以下列表: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
(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当然,通过跟踪索引并筛选我们需要的索引,这是可能的。”。但这是人为的,不值得去做。