首页 > 解决方案 > For循环,每第三个数字打印一次

问题描述

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

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

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

我的代码:

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

标签: racket

解决方案


我正在尝试创建一个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

推荐阅读