2016-09-21 11 views
1

Ich habe versucht, eine Funktion im Racket, die als (MakeList a b) zählt und dann zeigt eine Liste, so dass (a, a+1, a+2, ..., b). Ich habe versucht, aber etwas online zu finden, wie man eine Liste erstellt und dann hinzufügt, aber ich habe sehr wenig hilfreiche Informationen gefunden. Jede Hilfe zur Erstellung dieser Funktion wäre großartig.Wie mache ich eine Zählliste im Racket zwischen zwei Variablen

+1

Die Funktion, die Sie suchen ist [ 'range'] (http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib ._racket% 2Flist..rkt% 29._range% 29% 29) aus 'Schläger/Liste'. Wenn Sie es selbst implementieren müssen, klingt das wie Hausaufgaben. –

+0

Was hast du versucht und welchen Fehler hast du bekommen? – nyedidikeke

Antwort

1

Ich verstehe, das ist mehr als wahrscheinlich ein Hausaufgaben-Problem. Wie @AlexisKing darauf hinweist, existiert die range Funktion bereits. Aber wenn Sie dabei sind, dies selbst zu schreiben, würde ich gerne etwas Hilfe anbieten. Racket ist eine sehr lustige Sprache und ich möchte nicht, dass du dich entmutigt fühlst.

auf der hellen Seite der Suche, es klingt wie Sie meist, was Sie es brauchen

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

So zu tun, beginnen Sie mit diesem

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

Was ... ist hier tho? Nun, wie Sie in Ihrer erwarteten Ausgabe sagten ... wären

(a+1 ... b) 

So (a+1 ... b) ist eine Liste a+1-b - oder mit anderen Worten: (make-list (add1 a) b)

gut, das ist einfach. Lassen Sie uns es ausfüllen.

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

Aber warten Sie, das sollte für Sie alarmierend sein. Warum? Weil wir einfach für immer weitermachen ...

Wir müssen unserem Programm sagen, irgendwann aufzuhören, oder? Aber wann sollte es aufhören?

Lassen Sie uns eine kleine Wahrheitstabelle schreiben, um uns zu helfen. Der Ausdruck für unseren Tisch wird (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 

in Ordnung sein, so dass es ziemlich klar macht. Wenn agrößer alsb ist, können wir unsere Liste fertigstellen. Denken Sie daran, um anzuzeigen, das Ende einer Liste, verwenden wir die leere Liste, empty

(define (make-list a b) 
    (if (> a b) 
     empty 
     (cons a (make-list (add1 a) b))))

Check it

(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

Hier ist eine einfache & effiziente Art und Weise es in jedem Schema oder Lisp Implementierung zu tun:

Es beginnt mit einer leeren Liste, fügt b hinzu, fügt kleinere hinzu und gibt das Ergebnis zurück, sobald eserreicht.

1

Racket ist für/Listenfunktion kann auch wie folgt verwendet werden:

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

(make-list 5 10) 

Ausgang:

'(5 6 7 8 9 10) 

Aber a und b müssen> = 0

1

Nach Schleife kann auch verwendet werden, um eine solche Liste zu erstellen:

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


(ml 5 10) 

Ausgang:

'(5 6 7 8 9 10) 
Verwandte Themen