Ракетка встроенные функции повторения - PullRequest
0 голосов
/ 01 ноября 2018

Я искал способ повторить вызов функции определенное количество раз и накапливать результаты в списке, но ничего не нашел в стандартной библиотеке, поэтому написал один. Это просто написать, но кажется настолько очевидной вещью, что я чувствую, что должен быть принятый способ сделать это, используя стандартные библиотечные функции.

Вот две функции, которые я собираюсь заменить:

(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 голосов
/ 01 ноября 2018

Похоже, @AlexKnauth не хотел брать ваши интернет-баллы за свой ответ, и он сформулировал это как комментарий. Я не горжусь, хотя ... Используйте форму понимания списка ракетки:

(for/list ([i (in-range n)]) (f i))

(Я добавил явное «в диапазоне», просто для лучшей проверки ошибок.)

0 голосов
/ 01 ноября 2018

Если ваша функция не принимает аргументы, вы можете использовать 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)

Редактировать: вы также можете определить функцию для переноса лямбды

(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: если вы хотите иметь фиксированные аргументы, вы можете сделать что-то вроде

#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)
...