1

Racketで関数「範囲」を再定義しようとしています。

(define (my-range a b)
  (if (> a b)
      null
      (cons a (my-range (+ 1 a) b))))

;; Test

(my-range 2 5)

;; -> (cons 2 (cons 3 (cons 4 (cons 5 empty))))

今、私は次のように拡張したいと思いmy-rangeます:

(define (my-range a b step) ...)

(my-range 2 6 1)->(list 2 3 4 5)

最初の数字はaであり、後続の各要素はstep前の要素に追加することによって生成されます。シーケンスは、以上の要素の前で停止しbます。これどうやってするの?

4

2 に答える 2

3

繰り返しになりますが、範囲はすでにRacketライブラリに存在します。再定義する必要がない場合は、標準ライブラリにあるものを使用してください。

于 2012-12-02T22:06:49.327 に答える
2

コメントから、あなたはすでに解決策を見つけたと思います。完全を期すために、ここにあります:

(define (my-range a b step)
  (if (>= a b)
      null
      (cons a (my-range (+ step a) b step))))

実際、この手順はかなり一般的であり、いくつかの方法で表現できます。@dyooが指摘しているように、これrangeは標準的な手順です。

(define (my-range a b step)
  (range a b step))

また、build-list別の標準的なラケット手順:

(define (my-range a b step)
  (build-list (ceiling (/ (- b a) step))
              (lambda (x) (+ a (* step x)))))

またはストリームを使用する:

(define (my-range a b step)
  (stream->list (in-range a b step)))
于 2012-12-02T21:58:49.460 に答える