(Scheme)使用列表更改布尔数组中的值

时间:2015-11-26 20:15:35

标签: arrays boolean scheme racket bitvector

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

我查看了文档,发现了build-list [1]。所以我做了一个这样的零数组:

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

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

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

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)