我知道这很可能是作业问题。正如@AlexisKing 指出的那样,range 函数已经存在。但如果你坚持自己写这篇文章,我想提供一些帮助。 Racket 是一种非常有趣的语言,我不想让你气馁。
从好的方面看,听起来你大多知道你需要它做什么
(a, a+1, a+2, ..., b)
那就开始吧
(define (make-list a b)
(cons a ...))
这里的... 是什么?正如您在预期输出中所说,... 将是
(a+1 ... b)
所以(a+1 ... b) 是一个从a+1 到b 的列表——或者换句话说:(make-list (add1 a) b)
嗯,这很容易。让我们填写。
(define (make-list a b)
(cons a (make-list (add1 a) b)))
但是等等,这应该让你感到震惊。为什么?因为我们只是永远继续......
(cons a (cons a+1 (cons a+2 (cons a+3 ... (cons a+Infinity ...)))))
我们必须告诉我们的程序在某个时候停止,对吗?但是什么时候应该停止呢?
让我们写一个小真值表来帮助我们。我们表的表达式将是(make-list 0 4)
a b previous stop?
0 4 N/A no
1 4 (0 ...) no
2 4 (0 1 ...) no
3 4 (0 1 2 ...) no
4 4 (0 1 2 3 ...) no
5 4 (0 1 2 3 4 ...) yes – (0 1 2 3 4) is the value we'd like
好的,这样就很清楚了。当a 大于 b 时,我们可以完成我们的列表。请记住,为了表示列表的结束,我们使用空列表empty
(define (make-list a b)
(if (> a b)
empty
(cons a (make-list (add1 a) b))))
检查一下
(make-list 0 4) ;=> '(0 1 2 3 4)
(make-list 2 6) ;=> '(2 3 4 5 6)
(make-list 3 3) ;=> '(3)
(make-list 6 3) ;=> '()