我需要创建一个大小为800000的布尔值(0或1)数组。我还需要能够在索引处检查/更改值。 我无法使用向量或命令set!
。
我查看了文档,发现了build-list
[1]。所以我做了一个这样的零数组:
(define arrBool (build-list 800000 (lambda (x) (* x 0))))
我知道我可以使用list-ref
[2]访问索引。但是,我在文档中找不到有关如何更改该索引的值的任何内容。例如,如果我想将索引27392处的0
更改为1
,那么如何在不创建全新列表的情况下执行此操作?
任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
你可以使用boxes虽然它很尴尬:
> (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)