在写这个问题之前,我试图将我的代码简化到导致错误的部分,并且简化的代码有效......所以我将从这个开始:
此代码应采用每个 x 值,并使用 x 的值递增索引处的 y 条目。它突变了ys。请参阅下面的代码示例。
#lang racket
(require math/array)
(define xs (array #[5 1 3 1]))
(define ys (mutable-array #[0 0 0 0 0 0 0 0 0 0]))
(define result (array-map (λ (x) (array-set! ys
(vector x)
(add1 (array-ref ys (vector x)))))
xs))
>> ys
(mutable-array #[0 2 0 1 0 2 0 0 0 0])
现在,这是当这个问题标题中出现错误时我正在编写的代码:
第一个函数接受一个未排序的数组并找到其中的最大值。
(define (make-auxiliary-array unsorted)
(local ((define size-for-aux (array-ref (array-axis-max unsorted 0)
#())))
(array->mutable-array (make-array (vector size-for-aux) 0))))
第二个函数类似于顶部的工作代码。唯一的区别似乎是我在本地定义和使用数组。称为辅助的数组类似于顶部工作代码片段中的 ys。
(define (count-instances unsorted)
(local ((define auxiliary (make-auxiliary-array unsorted)))
(array-map (λ (u) (array-set! auxiliary
(vector u)
(add1 (array-ref auxiliary (vector u)))))
unsorted)))
>> (count-instances (array #[3 6 4 1 3 4 1 4]))
array-ref: expected indexes for shape '(6); given '#(6)
问题:
为什么(计数实例(函数有错误,但结果值没有?
我发现我需要使用 (向量 u( 从值制作索引。为什么我应该使用向量而不是(数组 u(?
这也许应该是一个完全独立的问题,但为什么(数组 #[42](与(数组 42(不同?
您的示例不起作用的原因是#(6)
不是形状的有效索引 #(6)
。 #(0)
, #(1)
, ...从#(5)
到都是有效的索引,但就像向量或列表索引一样,它们从0
到n - 1
。
问题出在size-for-aux
make-auxiliary-array
.表达式 (array-ref (array-axis-max unsorted 0) #())
是最大索引的大小,但size-for-aux
必须比这多一个,即(add1 (array-ref (array-axis-max unsorted 0) #()))
。
你的例子是:
#lang racket
(require math/array)
(define (make-auxiliary-array unsorted)
(local ((define size-for-aux (add1 (array-ref (array-axis-max unsorted 0)
#()))))
(array->mutable-array (make-array (vector size-for-aux) 0))))
(define (count-instances unsorted)
(local ((define auxiliary (make-auxiliary-array unsorted)))
(array-map (λ (u) (array-set! auxiliary
(vector u)
(add1 (array-ref auxiliary (vector u)))))
unsorted)))
(count-instances (array #[3 6 4 1 3 4 1 4]))
但是,这会产生(array #[#<void> #<void> #<void> #<void> #<void> #<void> #<void> #<void>])
,因为您从未真正返回auxiliary
。所以你可能的意思是:
(define (count-instances unsorted)
(local ((define auxiliary (make-auxiliary-array unsorted)))
(array-map (λ (u) (array-set! auxiliary
(vector u)
(add1 (array-ref auxiliary (vector u)))))
unsorted)
auxiliary))
(count-instances (array #[3 6 4 1 3 4 1 4]))
这会产生(mutable-array #[0 2 0 3 3 0 1])
.
嗯。我期待(mutable-array #[0 2 0 2 3 0 1])
.如果这是你真正想要的,你还有更多的东西要弄清楚,但那将是一个不同的问题。