2017-01-28 1 views
1

Hier erfüllen, sind der Code:Schema, Schläger helfen. Will Nummer zurück, wenn sie die Kriterien

(define make-simple-sv-num 
    (lambda (delare) 
    (let ((tal (random-from-to 100000 1000000))) 
     (cond ((= (divisible? (sum-of-digits tal) delare) #t) tal) 
      (else (make-simple-sv-num)))))) 

So ist die Spezifikation ich habe, ist eine zufällige 6-stellige Zahl zu machen, die auch diviseable durch die Eingabe-Variable „delare“ ist.

Mein Denkprozess mit dem Code war, "tal" an die Zufallszahl zu binden und sie dann in der Berechnung zu verwenden, und wenn es auscheckt, wird es die Zahl von "tal" zurückgeben. Wenn es aber die Bedingung nicht erfüllt, wird es sich selbst nennen und mein Gedanke war, dass wenn es das tut, es "tal" eine neue Zufallszahl geben würde und dies weiter tun würde, bis die Bedingung erfüllt ist und mir somit die gewünschte Art von Nummer geben würde.

Im diesen Fehler und ich verstehe nicht, wie man es beheben

=: contract violation 
    expected: number? 
    given: #t 
    argument position: 1st 
    other arguments...: 
+2

Wie die Fehlermeldung schon sagt, ' = 'funktioniert nur bei Zahlen. Versuchen Sie stattdessen 'equal?'. Für Booleans können Sie auch 'eq?' Verwenden, aber 'equal?' Ist normalerweise die sicherere Wette, wenn Sie die Feinheiten der Funktionsweise der einzelnen Operatoren nicht verstehen. –

+0

Keine Notwendigkeit, einen booleschen Wert mit true zu vergleichen, verwenden Sie einfach den booleschen Ausdruck als Test; nach allem, '(P <=> wahr) <=> P' – coredump

+0

Schauen Sie sich auch den rekursiven Aufruf: Was ist los damit? – tfb

Antwort

0

Ich denke, Ihr Code viel einfacher sein könnte, genau wie:

(define (make-simple-sv-num declare) 
    (let ([tal (random-from-to 100000 1000000)]) 
     (if (divisible? (sum-of-digits tal) delare) 
      tal 
      (make-simple-sv-num declare)))) 
Verwandte Themen