簡體   English   中英

如何在球拍中建立兩個變量之間的計數列表

[英]how to make a counting list in racket between two variables

我一直在嘗試在Racket中制作一個算作(MakeList ab)的函數,然后顯示諸如(a, a+1, a+2, ..., b) 我一直在嘗試,但是在網上找到了一些有關如何創建列表然后添加到列表的內容,但是卻很少提供有用的信息。 如何創建此功能的任何幫助都將非常棒。

在任何Scheme或Lisp實現中,這都是一種簡單有效的方法:

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

它從一個空列表開始,添加b ,一直在前面添加較小的列表,並在到達a返回結果。

我了解這很可能是家庭作業問題。 正如@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) ;=> '()

球拍的for / list函數也可以如下使用:

(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。

以下循環也可以用來創建這樣的列表:

(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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM