Racket For循环,每3个数字打印一次

Racket For循环,每3个数字打印一次,racket,Racket,我试图做一个for循环,循环遍历一个数字列表,并每隔3个数字打印一次 编辑:我只知道如何使用for循环,但我不完全确定是否有一个特定的函数可以用来只显示第三个数字。我觉得在使用car/cdr功能时,我可能走的是正确的道路,但我遇到了一个错误 其余:违反合同 应为:(和/c列表?(不是/c空?) 给定值:0 我的代码: (for/list ([x (in-range 20)] #:when (car(cdr(cdr x)))) (displayln x)) 以下是一个模板: (for ([x (

我试图做一个for循环,循环遍历一个数字列表,并每隔3个数字打印一次

编辑:我只知道如何使用for循环,但我不完全确定是否有一个特定的函数可以用来只显示第三个数字。我觉得在使用car/cdr功能时,我可能走的是正确的道路,但我遇到了一个错误

其余:违反合同 应为:(和/c列表?(不是/c空?) 给定值:0

我的代码:

(for/list ([x (in-range 20)] #:when (car(cdr(cdr x)))) (displayln x))
以下是一个模板:

(for ([x (in-list xs)]
      [i (in-naturals]
   #:when some-condition-involving-i)
  (displayln x))
我正在尝试为创建一个循环,循环遍历一个数字列表,并每隔三个数字打印一次

通常,使用所需的值创建一个新的列表,然后打印这些值,或者将它们传递给函数,或者执行任何其他可能需要的操作都更有用
for/list
确实返回了一个列表,这是OP示例代码遇到问题的原因之一。(OP代码中的其他问题包括
x
是带有
[x(范围20)]
的数字,因此未定义
(cdr x)

一种可能的解决方案是递归输入列表,使用
take
获取下三个值,保留第三个值,并使用
drop
减少输入列表:

;; Recurse using `take` and `drop`:
(define (every-3rd-1 lst)
  (if (< (length lst) 3)
      '()
      (cons (third (take lst 3))
            (every-3rd-1 (drop lst 3)))))
还有一种可能是使用
for/list
来建立一个列表;此处,
i
绑定到输入列表中的值,
计数器
绑定到计数数字列表中的值:

;; Use `for/list` to build a list:
(define (every-3rd-3 lst)
  (for/list ([i lst]
             [counter (range 1 (add1 (length lst)))]
             #:when (zero? (remainder counter 3)))
    i))
该函数(或其中任何一个函数)可以有效地进行广义化,以保持每个第n个元素:

;; Generalize to `every-nth`:
(define (every-nth n lst)
  (for/list ([i lst]
             [counter (range 1 (add1 (length lst)))]
             #:when (zero? (remainder counter n)))
    i))
最后,
map
可以通过将每n个索引的范围映射到列表中来创建包含每n个元素的列表:

;; Use `map` and `range`:
(define (every-nth-map n lst)
  (map (lambda (x) (list-ref lst x)) (range (sub1 n) (length lst) n)))
如果OP真正需要的只是打印每三个值,而不是创建每三个值的列表,那么上面的代码可能会提供有用的资料,让OP得出满意的结论。但是,这些函数中的每一个都可以用于按操作要求打印结果:

scratch.rkt>(对于([x(每三次一次)(a b c d e f g h i j k l m n o p)))
(显示Ln x)
C
F
我
L
o
scratch.rkt>(对于([x(每三次-2’(a b c d e f g h i j k l m n o p)))
(显示Ln x)
C
F
我
L
o
scratch.rkt>(对于([x(每3-3次)(a b c d e f g h i j k l m n o p)))
(显示Ln x)
C
F
我
L
o
scratch.rkt>(对于([x(每n次3’(a b c d e f g h i j k l m n o p)))
(显示Ln x)
C
F
我
L
o
scratch.rkt>(对于([x(每n个映射3’(a b c d e f g h i j k l m n o p)))
(显示Ln x)
C
F
我
L
o

问题询问每三个数字(例如3、6、9、12等)打印一次,但示例代码提供了每两个数字。需要什么?目标仍然是从列表中每隔3个数字打印一次。我已经对这篇文章做了修改,希望能澄清我之前可能给人的任何困惑。
;; Use `map` and `range`:
(define (every-nth-map n lst)
  (map (lambda (x) (list-ref lst x)) (range (sub1 n) (length lst) n)))