Vector 方案:求向量中元素的频率

Vector 方案:求向量中元素的频率,vector,scheme,iteration,racket,frequency,Vector,Scheme,Iteration,Racket,Frequency,我是新来的。我想得到向量中某个数字出现的次数 我在第0个索引为0的向量上使用这个函数 N是向量-1的长度 (我将此函数用作另一个函数的一部分……这就是我设置这些要求的原因。) 这就是我到目前为止在DrRacket的收获: (define (frequency? test-num solutions N) (do ((count 1 (+ count 1)) (result 0 (if (equal? (vector-ref solutions count) test-n

我是新来的。我想得到向量中某个数字出现的次数

我在第0个索引为0的向量上使用这个函数

N是向量-1的长度

(我将此函数用作另一个函数的一部分……这就是我设置这些要求的原因。)

这就是我到目前为止在DrRacket的收获:

(define (frequency? test-num solutions N)
  (do 
    ((count 1 (+ count 1)) 
     (result 0 (if (equal? (vector-ref solutions count) test-num) (add1 result) result)))
    ((<= count N) result)))

(define v (vector 0 3 2 4 5 2))

(frequency? 2 v 5) ; got 0 instead of 2
(定义(频率?测试数量解决方案N)
(做
((计数1(+计数1))
(结果0(如果(相等)(矢量参考溶液计数)测试数量)(添加1结果)结果)))

((您只需更改
(计数N)

如果在返回结果之前插入(显示计数),则
可以看出count的作用。

Jens的回答当然完全正确。您还可以问是否有其他更好的方法来编写此代码,我相信确实有。我可能会这样编写此代码:

#lang racket

(define (frequency? test-num solutions)
  (for/sum ([value (in-vector solutions)])
    (if (equal? value test-num) 1 0)))

(define v (vector 0 3 2 4 5 2))

(frequency? 2 v) ; got 0 instead of 2
请注意,不需要传递长度。当然还有许多其他的编写方法,包括
(长度(filter(lambda(x)(equal?x test num))解决方案)
,但尽管这可能更短,但我认为上面的方法更具可读性

一般来说,当我说
do
很少是表达程序的最好方式时,我认为我代表了相当大一部分诈骗者的观点

干杯

#lang racket

(define (frequency? test-num solutions)
  (for/sum ([value (in-vector solutions)])
    (if (equal? value test-num) 1 0)))

(define v (vector 0 3 2 4 5 2))

(frequency? 2 v) ; got 0 instead of 2