我正在尝试创建一个for循环,该循环遍历数字列表并打印出第三个数字。
编辑:我只是想出了如何使用for循环,但是我不确定是否有特定功能可以仅显示每个第3个数字。我觉得使用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
循环,该循环遍历数字列表并打印出第三个数字。
通常,创建具有所需值的新列表,然后打印这些值,或将它们传递给函数,或执行其他可能需要的操作,这会更有用。 for/list
确实确实输出了一个列表,这是OP遇到问题的原因之一。
一种可能的解决方案是遍历输入列表,使用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))
如果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