方案:查找向量中元素的频率

时间:2014-11-30 22:24:49

标签: vector scheme iteration racket frequency

我是Scheme的新人。我想得到一个向量中数字的出现次数。

我在第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

我检查过&#34;结果&#34;在第二个索引上变为1,但之后以某种方式恢复为0。

有没有更好的方法来编写这段代码?

2 个答案:

答案 0 :(得分:2)

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

请注意,无需传递长度。当然还有很多其他方法可以编写它,包括(length (filter (lambda (x) (equal? x test-num)) solutions),但是虽然可能更短,但我认为上面的方法更具可读性。

总的来说,当我说do很少是表达程序最好的方式时,我认为我代表相当大一部分的Racketeers。

干杯!

答案 1 :(得分:1)

您需要做的就是将(<= count N)更改为(> count N)

(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) 
     (display count) (newline)
     result]))

如果在返回结果之前插入(显示计数),则为 可以看出有什么重要的。