2016-06-24 8 views
0

Four Knightsの問題のために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(リスト、文字列、vecor、範囲、怠惰なシーケンス)とない#fのために何があるときtourプロシージャから結果として渡さされていない期待と述べていますソリューション。

tourの結果は、指定された開始位置で結果が終了しなかった場合に#f(偽)になるfor/orの結果になります。 3x3および4x4については、開始位置に関係なく溶液が存在せず、すべての出発位置について溶液が存在するが、溶液は存在しない。例えば。例えば。あなたの乱数が(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

関連する問題