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

时间:2020-03-30 17:00:05

标签: racket

我正在尝试创建一个for循环,该循环遍历数字列表并打印出第三个数字。

编辑:我只是想出了如何使用for循环,但是我不确定是否有特定功能可以仅显示每个第3个数字。我感觉使用car / cdr功能时可能走在正确的道路上,除非出现错误

休息:违反合同 预期:(和/ c列表?(不是/ c为空?)) 给定:0

我的代码:

(for/list ([x (in-range 20)] #:when (car(cdr(cdr x)))) (displayln x))

2 个答案:

答案 0 :(得分:2)

我正在尝试制作一个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

答案 1 :(得分:-1)

这是模板:

(for ([x (in-list xs)]
      [i (in-naturals]
   #:when some-condition-involving-i)
  (displayln x))
相关问题