2016-06-24 9 views
0

Ich versuche, ein 3x3 Schachbrett für das Problem mit vier Rittern zu bekommen. Hier ist der Code in der Schläger SpracheKann den Fehler in DrRacket nicht verstehen

#lang racket 
(define N 3) 
(define nexts ; construct the graph 
    (let ([ds (for*/list ([x 2] [x* '(+1 -1)] [y* '(+1 -1)]) 
       (cons (* x* (+ 1 x)) (* y* (- 2 x))))]) 
    (for*/vector ([i N] [j N]) 
     (filter values (for/list ([d ds]) 
         (let ([i (+ i (car d))] [j (+ j (cdr d))]) 
         (and (< -1 i N) (< -1 j N) (+ j (* N i))))))))) 
(define (tour x y) 
    (define xy (+ x (* N y))) 
    (let loop ([seen (list xy)] [ns (vector-ref nexts xy)] [n (sub1 (* N N))]) 
    (if (zero? n) (reverse seen) 
     (for/or ([next (sort (map (λ(n) (cons n (remq* seen (vector-ref nexts n)))) ns) 
          < #:key length #:cache-keys? #t)]) 
      (loop (cons (car next) seen) (cdr next) (sub1 n)))))) 
(define (draw tour) 
    (define v (make-vector (* N N))) 
    (for ([n tour] [i (in-naturals 1)]) (vector-set! v n i)) 
    (for ([i N]) 
    (displayln (string-join (for/list ([j (in-range i (* N N) N)]) 
           (~a (vector-ref v j) #:width 2 #:align 'right)) 
          " ")))) 
(draw (tour (random N) (random N))) 

Und es gibt mir diesen Fehler for: expected a sequence for n, got something else: #f und Highlights in diesem Abschnitt meines Code:

(define (draw tour) 
    (define v (make-vector (* N N))) 
    (for ([n tour] [i (in-naturals 1)]) (vector-set! v n i)) 
    (for ([i N]) 
    (displayln (string-join (for/list ([j (in-range i (* N N) N)]) 
           (~a (vector-ref v j) #:width 2 #:align 'right)) 
          " ")))) 

Und ich bin nicht sicher, was das Problem ist. Das ist für den Unterricht und ich habe keine Erfahrung mit der Schlägersprache. Jede Hilfe wäre willkommen.

Dank

Antwort

1

Der Fehler besagt, dass es die erwartete für Klausel n über eine Sequenz Iterieren zu sein (Liste, string, vecor, Reichweite, faul Sequenz) und #f nicht, die als Ergebnis der tour Prozedur übergeben wird, wenn es keine sind Lösungen.

Das Ergebnis tour ist das Ergebnis einer for/or die #f (false) ist, wenn keine der Iterationen mit einem Ergebnis mit der angegebenen Startposition beendet. Für 3x3 und 4x4 gibt es keine Lösungen unabhängig von der Startposition und für 5x5 gibt es Lösungen, aber nicht für alle Startpositionen. Z.B. Z.B. Wenn Ihre Zufallszahlen (1,2) auswählen, gibt es dafür auch keine Lösungen. Um diese Prüfung zu beheben, wenn Sie eine Lösung gefunden und nur ziehen, wenn Sie eine Lösung haben:

(let* ((x (random N)) (y (random N)) (result (tour x y))) 
    (if result 
    (draw result) ; only draw when result is not #f 
    (displayln (format "No results for initial position (~a,~a)" x y)))) 

Meine bisherigen obwohl war, dass for nicht nehmen Zahlen falsch war. Es wird es als range würde interpretieren und iterieren [0,N>. Der Grund für meine Annahme ist, dass dieses Merkmal nirgendwo in der for documentation zu finden ist.

(for/list ([n 10]) n) ; ==> (0 2 3 4 5 6 7 8 9) 
+0

Ich bin nicht sicher, dass es ein erstes Element haben soll, da es zufällig generiert wird. Wenn ich das N zu irgendeiner Zahl über 4 ändere, funktioniert es, aber nicht darunter, und ich brauche es, um für 3 zu arbeiten – butimnotarapper

+0

@Butimnotarapper Ich habe meine Antwort aktualisiert. Sie werden keine Lösungen für Startpositionen auf 3x3 und 4x4 Boards finden, da es keine gibt. – Sylwester