gpt4 book ai didi

for-loop - 在 Racket "for loop"中做两件事

转载 作者:行者123 更新时间:2023-12-03 06:33:53 31 4
gpt4 key购买 nike

我正在 Racket 中运行 for 循环,对于列表中的每个对象,我想执行两件事:如果该项目满足条件,(1) 将其附加到我的新列表中,(2) 然后打印列表。但我不知道如何在 Racket 中执行此操作。

这是我的除数函数:在 if 语句中,我检查范围内的数字是否可以整除 N。如果可以,我将该项附加到新列表 L 中。完成所有循环后,我打印 L。但由于某种未知的原因,该函数仍然返回 L 作为空列表,所以我想看看 for 循环在每个循环中做了什么。但显然 Racket 似乎并没有在一个“for 循环”中采取两个 Action 。那么我应该怎么做呢?

    (define (divisor N)
(define L '())
(for ([i (in-range 1 N)])
(if (equal? (modulo N i) 0)
(append L (list i))
L)
)
write L)

提前非常感谢!

最佳答案

注意:这个答案建立在@uselpa 的答案之上,我对此表示赞同。

for表单有一个可选的 #:when 子句。使用for/fold:

#lang racket

(define (divisors N)
(reverse (for/fold ([xs '()])
([n (in-range 1 N)]
#:when (zero? (modulo N n)))
(displayln n)
(cons n xs))))

(require rackunit)
(check-equal? (divisors 100)
'(1 2 4 5 10 20 25 50))
<小时/>

我意识到您的核心问题是如何显示每个中间列表。但是,如果您不需要这样做,那么使用 for/list 会更简单。 :

 (define (divisors N)
(for/list ([n (in-range 1 N)]
#:when (zero? (modulo N n)))
n))

换句话说,传统的Scheme (filter __ (map __))filter-map在Racket中也可以表示为for/list 使用 #:when 子句。

<小时/>

表达这一点的方式有很多种。我认为我们所有答案的共同点是您可能希望避免使用 forset! 来构建结果列表。这样做并不是惯用的Scheme 或Racket。

关于for-loop - 在 Racket "for loop"中做两件事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711117/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com