2016-06-24 1 views
0

4 기사 문제에 3x3 체스 판을 얻으려고합니다. 여기에 라켓 언어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에 대한 더이있을 때 tour 프로 시저에서 결과로 전달되지 시퀀스 (목록, 문자열, vecor, 범위, 게으른 순서)하지 #f 반복 될 것으로 예상한다고 솔루션.

결과가 for/or 인 결과는 (false)입니다. 반복이 없으면 주어진 시작 위치로 결과가 끝납니다. 3x34x4의 경우 시작 위치에 상관없이 솔루션이 없으며 모든 시작 위치에 솔루션이있는 것은 아니지만 솔루션이 있습니다. 예 : 예 : 임의의 숫자가 (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

관련 문제