【问题标题】:(Scheme) Changing value in an array of booleans using a list(方案)使用列表更改布尔数组中的值
【发布时间】:2015-11-26 20:15:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在 Racket 中,列表是不可变的,所以你不能这样做。您应该使用 Racket、教学语言还是传统的 Scheme?
  • 我们应该使用 Racket。那我还有其他方法可以做到这一点吗?起初我使用向量,但我的教授不接受它,因为他希望我们使用常规列表,所以我不知道如何继续。
  • 你可以使用盒子;我怀疑这是你教授的意图,但我会发布一个例子。

标签: arrays boolean scheme racket bitvector


【解决方案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)

【讨论】:

  • 谢谢,不幸的是,他也不希望我们使用盒子(刚刚问过)。虽然,我确实学到了一些新东西;太棒了!我可以用另一种方式做到这一点吗?在构建列表时,我可以将某些索引设置为 1 吗?
  • 如果您需要使用不可变列表,那么您必须在每次更新元素时​​创建一个新列表。
  • 害怕那个;特别是考虑到列表的大小。不过谢谢!
  • 构建列表时可以设置值为1;将发布一个示例。
  • 不客气。考虑到您应该处理的“数组”的大小,可以以更有效的方式对此进行编程。但在现实生活中,您会使用矢量。
猜你喜欢
  • 2023-01-20
  • 2019-04-30
  • 1970-01-01
  • 2016-05-15
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
相关资源
最近更新 更多