向量的方案修改向量



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

111111
100001
100001
111111

1为黑色边框,0为空白。

我遇到了一个障碍。我的解是向量#(#(111111) (100001) (100001) (100001))的向量因为它以后很容易修改。首先,我创建了一个由0填充的向量组成的向量,然后我想把它的值设为1。

问题是,例如,如果我想改变第一个向量的第一个元素为1,我不知道为什么程序设置所有向量的第一个元素为1。所以我想要得到:: #(100000) (000000) (000000) (000000))但我得到#(#(100000) (100000) (100000) (100000))

代码是:

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

有谁能解释一下更简单的解决方案吗?

这将避免混叠问题:

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

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

(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!)时,它可能会导致令人惊讶的结果。

最新更新