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,另一个标准的 Racket 程序:

(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 回答