【问题标题】:computing average or a list with letters in Scheme - Dr.Racket在 Scheme - Drracket 中计算带有字母的列表的平均值
【发布时间】:2017-07-07 05:51:44
【问题描述】:

我需要帮助创建一个函数,该函数将计算列表中也可以包含字母的平均值。例如:

(mean '(1 2 3 4 5)); → 3
(mean '(1 a 2 b c d e 3)); → 2
(mean '(a b c d e)); → "Error: no numbers in list"

到目前为止,这就是我所拥有的,但我得到了这个我不明白的错误:

(define new_list '())

(define (mean lis)
  (if (null? lis)
      (display "Error: no numbers in list")
      (avg(set! new_list (my-filter number? lis))) ;my-filter, filters out everything except numbers
  )
)

(define (avg lis)
  (/ (apply + lis) (length lis)))

我得到的错误信息:

mcar: contract violation
expected: mpair?
given: #<void>

任何帮助将不胜感激

【问题讨论】:

    标签: list scheme racket average mean


    【解决方案1】:
    ; mean-of-numbers computes the mean of a list of numbers (only)
    (define (mean-of-numbers xs) ...)
    
    ; mean computes the mean of the numbers of the list xs ignoring other values
    (define (mean xs) 
      (mean-of-numbers (filter number? xs))
    

    【讨论】:

      【解决方案2】:

      错误在以下行:

      (avg(set! new_list (my-filter number? lis))) ;my-filter, filters out everything except numbers
      

      你不需要设置!任何新列表。您可以将 my-filter fn 的结果传递给 avg fn。

      另外,if 语句判断列表是否为空;如果列表中没有数字,则不是。因此,需要更正错误消息(“错误:列表中没有数字”)。

      此外,avg 函数应该处理除以 0,这将在您的第三个示例中出现(当列表中没有数字时)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 2011-03-19
        • 2017-03-12
        • 2021-12-24
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多