所以我想在方案中生成一个位向量。然后在散列函数h(v)= X之后取一个somethings值。然后在位向量中将该位置设置为0到1.有关如何创建位向量然后操纵向量中的特定位置的任何想法?感谢
答案 0 :(得分:1)
如您所述,我们可以使用vector
数据结构来表示Scheme中的位向量,请参阅解释器的documentation。首先,使用您期望的最大元素数创建一个新的vector
,并使用零初始化它。例如,要创建大小为10
的向量,请执行以下操作:
(define bit-vector (make-vector 10 0))
bit-vector
=> '#(0 0 0 0 0 0 0 0 0 0)
要在给定值中设置索引,请使用vector-set!
。假设我们要将索引3
设置为1
,并注意最后的!
(发音为 bang!)表示此过程就地改变了载体:
(vector-set! bit-vector 3 1)
bit-vector
=> '#(0 0 0 1 0 0 0 0 0 0)
最后,要检索给定索引处的值,我们使用vector-ref
:
(vector-ref bit-vector 3)
=> 1
对于第二部分:我们如何获得值为true的索引列表?有几种方法,都涉及遍历向量,测试每个位置的值并将结果累积到列表中。例如,使用显式递归:
(define (true-indexes bit-vector)
(let loop ([idx (sub1 (vector-length bit-vector))] [acc '()])
(cond ((negative? idx) acc)
((= (vector-ref bit-vector idx) 1)
(loop (sub1 idx) (cons idx acc)))
(else
(loop (sub1 idx) acc)))))
如果你很幸运并使用复杂的Scheme解释器,我们可以根据迭代和理解来编写一个惯用的解决方案。例如,在Racket中:
(define (true-indexes bit-vector)
(for/list ([(val idx) (in-indexed bit-vector)]
#:when (= val 1))
idx))
无论哪种方式,它都按预期工作:
(true-indexes (vector 0 0 1 0 1))
=> '(2 4)
答案 1 :(得分:0)
如果是这样的话,我会假设你想要一个二进制数的向量:
(let ((vec (make-vector n 0)))
(vector-set! vec x 1)
vec)
如果你需要一个位向量,我只在guile& chiken scheme,界面不同。