1

我是一个初学者程序员。我必须在纯 Scheme 中编写一个简单的程序,它将打印出一个给定高度和宽度的矩形(例如 4,6):

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

大胆猜测,您已经像这样构建了二维向量:

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

然后你有一个向量,称为table,它包含对 的四个引用row而你需要的是可以独立修改的四个副本。row你可以用

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

(从技术上讲,你的向量是共享结构的。通常,这是一件好事,但是当你使用破坏性修改时,例如vector-set!,它可能会导致令人惊讶的结果。)

于 2013-05-01T19:45:51.467 回答