2016-06-24 3 views
0

Я пытаюсь получить 3х3 шахматную доску для проблемы Четыре рыцарей. Вот код на языке ракетокне может понять ошибку в DrRacket

#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))) 

И это дает мне эту ошибку for: expected a sequence for n, got something else: #f и выделяет этот раздел моего кода:

(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)) 
          " ")))) 

И я не уверен, что проблема есть. Это для класса, и я не знаком с языком ракетки. Любая помощь будет оценена по достоинству. Благодаря

ответ

1

Ошибка заявляет, что она ожидает, что для пункта n быть итерацией по последовательности (список, строки, Vecor, диапазон, ленивая последовательность) и не #f, которая не передаются в результате из tour процедуры при наличии нет решения.

Результат tour является результатом for/or, который будет #f (false), если ни одна из итераций не завершилась результатом с заданной начальной позицией. Для 3x3 и 4x4 нет решения независимо от того, исходного положения и 5x5 есть решения, но не для всех стартовых позиций. Например. Например. если ваши случайные числа выбирают (1,2), нет никаких решений. Чтобы исправить эту проверку, если вы нашли решение и только рисовать, когда у вас есть решение:

(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)))) 

Мой предыдущий, хотя в том, что for не брали номера было неправильно. Он будет интерпретировать его как range и повторить [0,N>. Причина моего предположения заключается в том, что эту функцию нигде не найти в for documentation.

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

Я не уверен, что он должен иметь первый элемент, поскольку он случайным образом генерируется. Если я изменю N на любое число выше 4, оно работает, но не под, и мне нужно, чтобы он работал для 3 – butimnotarapper

+0

@butimnotarapper. Я обновил свой ответ. Вы не найдете решений для любой начальной позиции на досках 3x3 и 4x4, так как их нет. – Sylwester

Смежные вопросы