For循环将打印出第三个数字

问题描述 投票:-1回答:2

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

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

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

我的代码:

(for/list ([x (in-range 20)] #:when (car(cdr(cdr x)))) (displayln x))
racket
2个回答
0
投票

这里是模板:

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

0
投票

我正在尝试进行一个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
© www.soinside.com 2019 - 2024. All rights reserved.