1

私は初心者のプログラマーです。指定された高さと幅 (たとえば 4,6) の四角形を出力する単純なプログラムを純粋な Scheme で作成する必要があります。

111111
100001
100001
111111

1 は黒枠、0 は空白です。

障害に遭遇しています。#(#(111111) (100001) (100001) (100001))後で簡単に変更できるため、私の解決策はベクトルのベクトルです。最初にゼロで満たされたベクトルのベクトルを作成し、後でその値を 1 に設定します。

問題は、たとえば、最初のベクトルの最初の要素を 1 に変更したい場合、プログラムがすべてのベクトルの最初の要素を 1 に設定する理由がわからないことです#(100000) (000000) (000000) (000000))#(#(100000) (100000) (100000) (100000))

コードは次のとおりです。

(vector-set! (vector-ref vect 0) 0 "1")

おそらくもっと簡単な解決策について説明している人はいますか?

4

2 に答える 2

2

これにより、エイリアシングの問題が回避されます。

(define (make-board n)
  (let ((table (make-vector n)))
    (let filling ((i 0))
      (if (= i n)
          table
          (begin (vector-set! table i (make-vector n 0))
                 (filling (+ i 1)))))))
于 2013-05-01T21:02:47.100 に答える
1

勝手な推測ですが、次のように 2 次元ベクトルを作成しました。

(define row #(0 0 0 0 0 0))
(define table (vector row row row row))

次に、 への 4 つの参照table保持すると呼ばれるベクトルがあり、必要なのは、個別に変更できるの 4 つのコピーです。あなたはそれを得ることができますrowrow

(define table (vector (vector-copy row)
                      (vector-copy row)
                      (vector-copy row)
                      (vector-copy row)))

(技術的に言えば、ベクトルは構造を共有しています。多くの場合、これは良いことですが、破壊的な変更を使用してvector-set!いる場合、たとえば、驚くべき結果につながる可能性があります。)

于 2013-05-01T19:45:51.467 に答える