我一直在寻找一种方法来重复一次函数调用一定次数,并将结果累积在列表中,而在标准库中找不到任何内容,所以我写了一个。编写起来很简单,但是看起来很明显,我觉得必须有一种使用标准库函数来实现此目的的可接受方法。
这是我要替换的两个功能:
(define (repeat n f)
(unless (<= n 0)
(f)
(repeat (sub1 n) f)))
(define (accumulate n f)
(let loop ([n n] [l empty])
(if (<= n 0)
l
(loop (sub1 n)
(cons (f) l)))))
有没有更简单的方法来实现这一目标?
答案 0 :(得分:3)
@AlexKnauth似乎不愿意将您的互联网积分作为他的答案,因此他将其列为评论。不过,我并不感到骄傲……请使用球拍的列表理解表:
(for/list ([i (in-range n)]) (f i))
(我添加了一个明确的“范围内”,目的是为了更好地进行错误检查。)
答案 1 :(得分:2)
如果您的函数没有任何参数,则可以使用build-list
示例:
#lang racket
;; The function you want to call many times
(define (f)
#t)
;; Use build list with a lambda to wrap your function because
;; build-list want a function takin integer as its second argument
(build-list 5 (lambda (x) (f)))
结果:
'(#t #t #t #t #t)
编辑:您还可以定义一个包装lambda的函数
(define (repeat-then-accumulate n f)
(build-list n (lambda (x) (f)))
)
用法:
;; Using the f function defined earlier
(repeat-then-accumulate 10 f)
结果:
'(#t #t #t #t #t #t #t #t #t #t)
Edit2:如果您想要固定的args,可以执行类似的操作
#lang racket
;; The function you want to call many times
(define (f a b)
(+ a b))
(define (repeat-then-accumulate n f args)
(build-list n (lambda (x) (apply f args)))
)
用法:
(repeat-then-accumulate 10 f '(3 5))
结果:
'(8 8 8 8 8 8 8 8 8 8)