2013-05-01 61 views
0

我是一名初學者編程員。我必須寫在純方案一個簡單的程序,將打印出給定的高度和寬度(例如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") 

沒有人有可能更容易解決的explenation?

回答

1

這將避免aliasing問題:

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

胡亂猜測,你已經構建了2-d載體,像這樣:

(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!,則可能導致意外。結果)

+0

對不起,我應該張貼此較早: 我創建它: '(define vect(make-vector h(make-vector w 0)))' 這是問題嗎? – maciek 2013-05-01 19:50:57

+0

@MaciekBąk:是的,情況完全一樣。你創建一個大小爲「w」的向量,然後你將一個引用傳遞給外部的'make-vector',它只是重複引用而不是複製向量。 – 2013-05-01 19:53:49

+0

好吧,我明白了。 但是我不能使用矢量副本或任何其他庫。有沒有簡單的方法來構造一個高度和寬度的二維矢量,以便所有的行都是分開的? – maciek 2013-05-01 20:06:30