0

我需要创建一个大小为 800000 的布尔值(0 或 1)数组。我还需要能够尽可能检查/更改索引处的值。我不能使用向量或命令set!

我正在查看文档并找到build-list[ 1 ]。所以我做了一个这样的零数组:

(define arrBool (build-list 800000 (lambda (x) (* x 0))))

我知道我可以使用list-ref[ 2 ] 访问索引。但是,我在文档中找不到有关如何更改该索引处的值的任何内容。例如,如果我想将0at 索引 27392 更改为 a 1,我将如何在不创建全新列表的情况下执行此操作?

任何帮助将不胜感激,谢谢!

4

1 回答 1

1

你可以使用盒子,虽然它很尴尬:

> (define arrBool (build-list 20 (lambda (x) (box 0))))
> arrBool
'(#&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0)
> (set-box! (list-ref arrBool 2) 1)
> (set-box! (list-ref arrBool 9) 1)
> arrBool
'(#&0 #&0 #&1 #&0 #&0 #&0 #&0 #&0 #&0 #&1 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0 #&0)
> (unbox (list-ref arrBool 0))
0
> (unbox (list-ref arrBool 2))
1

编辑

要在构建列表时将一些索引设置为 1,请执行

(define (make-list size indices-to-set)
  (build-list size (lambda (i) (if (member i indices-to-set) 1 0))))

然后

> (make-list 20 '(2 9))
'(0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0)
于 2015-11-26T20:40:04.313 回答