【问题标题】:Scheme: Find the frequency of an element in a vector方案:查找向量中元素的频率
【发布时间】:2014-12-01 08:24:03
【问题描述】:

我是 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

我检查了“结果”在第二个索引上更改为 1,但之后不知何故恢复为 0。

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

【问题讨论】:

    标签: vector scheme iteration racket frequency


    【解决方案1】:

    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 很少是表达程序的最佳方式时,我认为我代表了相当大一部分的敲诈者。

    干杯!

    【讨论】:

      【解决方案2】:

      您只需将(&lt;= count N) 更改为(&gt; 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]))
      

      如果您在返回结果之前插入(显示计数),您 可以用count看看什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        相关资源
        最近更新 更多