2016-09-21 72 views
1

之間我一直在試圖使球拍的功能則計爲(MakeList a b),然後顯示,使得(a, a+1, a+2, ..., b)列表。我一直在嘗試,但找到了一些關於如何創建列表然後添加到列表的東西,但是已經提供了很少有用的信息。有關如何創建此功能的任何幫助將非常棒。如何使計數列表球拍兩個變量

+1

你要找的功能是['range'](http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib ._racket%2Flist..rkt%29._range%29%29)from'racket/list'。如果你必須自己實現它,這聽起來像作業。 –

+0

你試過了什麼,得到了什麼錯誤? – nyedidikeke

回答

1

我理解,這是很可能一個家庭作業問題的更多。正如@AlexisKing指出的那樣,range函數已經存在。但是,如果你堅持自己寫這個,我想提供一些幫助。球拍是一種非常有趣的語言,我不希望你感到灰心。

尋找光明的一面,這聽起來像你大多知道你需要做的

(a, a+1, a+2, ..., b) 

所以與

(define (make-list a b) 
    (cons a ...)) 

什麼是...這裏壽開始?以及你在你的預期輸出表示,...

(a+1 ... b) 

所以(a+1 ... b)a+1b列表 - 或者換句話說:(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) ;=> '() 
2

下面是一個簡單&有效的方式做任何計劃或Lisp實現:

(define (makelist a b) 
    (do ((i b (- i 1)) 
     (lst '() (cons i lst))) 
    ((< i a) lst))) 

它從一個空列表開始,增加了b,在前面加上較小的那個,並在返回結果後返回a

1

球拍的對/列表功能還可以被使用如下:

(define (make-list a b) 
    (for/list ((i (in-naturals)) 
      #:break (> i b) 
      #:when (and (>= i a) (<= i b))) 
    i)) 

(make-list 5 10) 

輸出:

'(5 6 7 8 9 10) 

但是a和b必須是> = 0

1

下面的循環可以也可用於創建這樣的清單:

(define (ml a b) 
    (let loop ((a a) (lst '())) 
    (if (> a b) 
     (reverse lst) 
     (loop (add1 a) (cons a lst))))) 


(ml 5 10) 

輸出:

'(5 6 7 8 9 10)