【问题标题】:How are these nested vectors connected?这些嵌套向量是如何连接的?
【发布时间】:2019-06-30 12:41:44
【问题描述】:

我编写了一段代码,它创建了一个向量“记分板”,其中包含 3 个大小为 3 的单独向量,所有向量都包含符号 ?在所有指数 0-2。当我现在执行“向量集!”时在记分牌的第一个向量上,要将其第一个元素更改为 'X,向量 2 和 3 也会发生变化。这是怎么发生的?

(define scoreboard (make-vector 3 (make-vector 3 '?)))
(define (display-scoreboard)
(display (vector-ref scoreboard 0))
(newline)
(display (vector-ref scoreboard 1))
(newline)
(display (vector-ref scoreboard 2))
(newline))

(define (X! pos)
(cond
((>= 3 pos) (vector-set! (vector-ref scoreboard 0) (- pos 1) 'X))
))

(display-scoreboard)
(X! 1)
(newline)
(display-scoreboard)

输出:

#(? ? ?)
#(? ? ?)
#(? ? ?)

#(X ? ?)
#(X ? ?)
#(X ? ?)

期望的输出:

#(? ? ?)
#(? ? ?)
#(? ? ?)

#(X ? ?)
#(? ? ?)
#(? ? ?)

【问题讨论】:

    标签: scheme racket r5rs


    【解决方案1】:

    图片显示(make-vector 3 (make-vector 3 '()))创建了一个向量 在所有三个插槽中具有相同的行(向量)。

    改为写(vector (vector '() '() '()) (vector '() '() '()) (vector '() '() '()))。 或者做一个小辅助函数:

    (define (make-row) (vector '() '() '()))
    (vector (make-row) (make-row) (make-row))
    

    【讨论】:

      【解决方案2】:

      除了@soegaard 的出色回答之外,我想指出创建非共享向量的惯用方法是使用build-vector

      ;; ignore i and j since we want all elements to be the same
      > (define table (build-vector 3 (lambda (i) (build-vector 3 (lambda (j) '?)))))
      > table
      '#(#(? ? ?) #(? ? ?) #(? ? ?))
      ;; this will mutate only one row
      > (vector-set! (vector-ref table 0) 0 42)
      > table
      '#(#(42 ? ?) #(? ? ?) #(? ? ?))
      ;; we can use i and j to make different elements for each index
      > (build-vector 3 (lambda (i) (build-vector 3 (lambda (j) (* (add1 i) (add1 j))))))
      '#(#(1 2 3) #(2 4 6) #(3 6 9))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2021-12-25
        • 2017-08-02
        • 2020-02-24
        • 1970-01-01
        • 2018-09-16
        相关资源
        最近更新 更多