1

スキームには、関数を n 回呼び出す関数がありますか。関数には引数がないため、map/for-each は必要ありません。これに沿った何か:-

(define (call-n-times proc n)
        (if (= 0 n)
            '()
            (cons (proc) (call-n-times proc (- n 1)))))

(call-n-times read 10)
4

2 に答える 2

2

SRFI 1には、指定されたlist-tabulate関数を呼び出してリストを構築できる関数があり、引数は 0 から まで(- n 1)です。ただし、実行の順序を保証するものではありません (実際、多くの実装は から開始し(- n 1)てダウンします) read

Racket では、次のことができます。

(for/list ((i 10))
  (read))

10 回呼び出しreadて、それぞれの結果を収集します。そしてそれは左から右に行われます。しかし、あなたが Guile の質問にタグを付けたので、別のことをする必要があります。

幸いなことに、Guile にはSRFI 42があり、次のことが可能です。

(list-ec (: i 10)
  (read))
于 2014-01-24T10:25:20.067 に答える
0

O(1) 余分なスペースで結果のリストを構築するために、手動で末尾再帰モジュロ コンス最適化を実装します。

(define (iterate0-n proc n)   ; iterate a 0-arguments procedure n times
  (let ((res (list 1)))       ; return a list of results in order
    (let loop ((i n) (p res))
      (if (< i 1)
        (cdr res)
        (begin
          (set-cdr! p (list (proc)))
          (loop (- i 1) (cdr p)))))))

この手法は、 Friedman と Wise の TR19で最初に (?) 説明されました。

于 2014-01-24T17:19:33.810 に答える