2016-11-08 18 views
0

Ich versuche, eine Funktion zu schreiben, die die Länge einer Liste und einen maximalen Zahlenwert aufnimmt und eine Liste zurückgibt, die die mit Zahlen zwischen 1 und dem gegebenen Maximum zufällig angegebene Länge ist.Erstellen einer zufälligen Liste

so weit ich habe

(define (randomlist n max) 
(cond 
    [(= n 0)empty] 
    [else 
     (cons (build-list n (random 1 max)) 
      (randomlist max (- n 1)))])) 

Ich erhalte eine Fehlermeldung, wenn ich das laufen und habe mich gefragt, ob jemand mir helfen könnte.

+0

Es würde helfen zu wissen, welchen Fehler Sie bekommen. –

+0

Warum wechseln Sie die Reihenfolge von 'n' und' max'? – Sylwester

Antwort

1

Es gibt mehrere Fehler in Ihrem Code:

  • Es ist eine schlechte Idee, einen Parameter max, dass Kollisionen mit einem eingebauten in Prozedur aufzurufen. Also habe ich ihn in mx umbenannt.
  • Es gibt absolut keinen Grund zu verwenden build-list, das ist nicht, wie wir eine Ausgabeliste erstellen, nur cons ein Element mit dem Rest.
  • random empfängt null oder einen Parameter, nicht zwei. Die Single-Parameter-Version gibt eine Ganzzahl im Bereich 0..n-1 zurück. Daher müssen wir 1 hinzufügen, damit das Ergebnis im Bereich 1..n liegt.
  • Sie haben die Reihenfolge der Parameter beim rekursiven Aufruf von randomlist geändert.

Dies sollte sich um die Probleme nehmen:

(define (randomlist n mx) 
    (cond 
    [(= n 0) empty] 
    [else 
    (cons (+ 1 (random mx)) 
      (randomlist (- n 1) mx))])) 

Es funktioniert wie erwartet:

(randomlist 5 10) 
=> '(10 7 1 4 8) ; results will vary, obviously 
+0

@JohnC Wenn diese oder eine andere Antwort Ihr Problem löst, vergessen Sie nicht, [akzeptieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) es;) es ist einfach, klicken Sie einfach auf das Häkchen auf der linken Seite. –

1

Man kann auch for/list verwenden, um Schleife und Listenbildung zu kombinieren:

(define (randomlist n mx) 
    (for/list ((i n)) 
    (add1 (random mx)))) 

Prüfung:

(randomlist 5 10) 

Output:

'(5 9 10 4 7) 

(Zufallszahlen, ist daher sehr wahrscheinlich, Ausgabe jedes Mal anders zu sein).

Verwandte Themen