racket - For循环,每第三个数字打印一次
问题描述
我正在尝试创建一个 for 循环,该循环遍历一个数字列表并打印出每个第三个数字。
编辑:我只知道如何使用 for 循环,但我不完全确定是否有一个特定的函数可以用来只显示每个第三个数字。我觉得在使用 car/cdr 功能时我可能走在正确的道路上,但出现错误
休息:预期违反合同:(和/c列表?(不是/c为空?))给定:0
我的代码:
(for/list ([x (in-range 20)] #:when (car(cdr(cdr x)))) (displayln x))
解决方案
我正在尝试创建一个
for
循环遍历数字列表并打印出每个第三个数字。
通常,使用所需值创建一个新列表,然后打印这些值,或将它们传递给函数,或执行其他任何可能需要的操作会更有用。for/list
确实返回了一个列表,这是 OP 示例代码遇到问题的原因之一。(OP 代码中的其他问题包括x
带有 的数字[x (in-range 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)))))
另一种选择是使用辅助计数器在输入列表上递归;从 1 开始,仅当计数器为 3 的倍数时才保留输入列表中的值:
;; Recurse using an auxilliary counter:
(define (every-3rd-2 lst)
(define (every-3rd-helper lst counter)
(cond [(null? lst)
'()]
[(zero? (remainder counter 3))
(cons (first lst) (every-3rd-helper (rest lst) (add1 counter)))]
[else (every-3rd-helper (rest lst) (add1 counter))]))
(every-3rd-helper lst 1))
还有一种可能性是for/list
用来建立一个列表;这里i
绑定到输入列表中的值,并且counter
绑定到计数列表中的值:
;; 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 得出令人满意的结论。但是,这些函数中的每一个都可以用来打印 OP 需要的结果,以及:
scratch.rkt> (for ([x (every-3rd-1 '(a b c d e f g h i j k l m n o p))])
(displayln x))
c
f
i
l
o
scratch.rkt> (for ([x (every-3rd-2 '(a b c d e f g h i j k l m n o p))])
(displayln x))
c
f
i
l
o
scratch.rkt> (for ([x (every-3rd-3 '(a b c d e f g h i j k l m n o p))])
(displayln x))
c
f
i
l
o
scratch.rkt> (for ([x (every-nth 3 '(a b c d e f g h i j k l m n o p))])
(displayln x))
c
f
i
l
o
scratch.rkt> (for ([x (every-nth-map 3 '(a b c d e f g h i j k l m n o p))])
(displayln x))
c
f
i
l
o
推荐阅读
- r - 我想将我的主要 R 代码与 Shiny 结合起来。我在 R Studio 中得到输出,但在 Shiny 中没有输出。可能是什么原因?
- javascript - 保留订单和有条件地禁用按钮
- html - 使用 HTML 和 AngularJS 将 JSON 保存到文件系统
- swift - 无法解决框架问题
- angular - 我们可以使用带有对象属性的 [(ngModel)] 指令吗?
- javascript - 键盘输入极慢
- r - 如何在 R 中的绘图上连接数据点(针对每个主题)?
- reactjs - 获取ACF关系类型的相关ACF字段
- javascript - 正则表达式没有返回多个匹配项
- python - jupyter notebook中的国旗怎么降价?