[英]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+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) ;=> '()
球拍的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.