球拍内置重复功能

时间:2018-10-31 21:45:39

标签: racket

我一直在寻找一种方法来重复一次函数调用一定次数,并将结果累积在列表中,而在标准库中找不到任何内容,所以我写了一个。编写起来很简单,但是看起来很明显,我觉得必须有一种使用标准库函数来实现此目的的可接受方法。

这是我要替换的两个功能:

(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)))))

有没有更简单的方法来实现这一目标?

2 个答案:

答案 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)