我是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。
有没有更好的方法来编写这段代码?
答案 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]))
如果在返回结果之前插入(显示计数),则为 可以看出有什么重要的。