我是一个初级程序员。我必须用纯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!
)时,它可能会导致令人惊讶的结果。