首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习LISP -定义stdev函数

学习LISP -定义stdev函数
EN

Stack Overflow用户
提问于 2016-09-11 17:26:51
回答 2查看 533关注 0票数 0

我对LISP非常陌生(请原谅我所犯的任何愚蠢的错误),今年的第一个实验室指出:

定义一个函数STDEV,它将计算数字列表的标准差(查找公式)。

我写了这段代码,但我不知道它为什么不起作用:

代码语言:javascript
复制
(defun stdev (x)
  (sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
                                   (length x)))
                           2))
           (length x))))

(setq a '(1 2 3 4 5))

(STDEV a)

但是在运行时,它会产生错误:

代码语言:javascript
复制
(1 2 3 4 5) is not a number

我相信我已经正确地模拟了标准偏差公式(虽然我不会把它抛到过去去犯一个愚蠢的错误),但是为什么我的程序不喜欢我给它评估的数字列表呢?这很可能是一个简单的错误,输入从这种新的编码风格,但任何和所有的帮助是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-11 18:34:13

使用压痕。我编辑了你的问题:

代码语言:javascript
复制
(defun stdev (x)
  (sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
                                   (length x)))
                           2))
           (length x))))

expt返回一个数字。你叫(apply '+ some-number)

也可以从列表中减去一个数字。

为什么?

通常建议使用Lisp侦听器(也称为REPL)来实现工作代码:

计算平均值:

代码语言:javascript
复制
CL-USER 21 > (let ((l (list 1 2 3 4 5)))
               (/ (reduce #'+ l)
                  (length l)))
3

映射器减去平均值和平方

代码语言:javascript
复制
CL-USER 22 > (mapcar (lambda (item)
                       (expt (- item 3) 2))
                     (list 1 2 3 4 5))
(4 1 0 1 4)

将方差计算为上述平均值:

代码语言:javascript
复制
CL-USER 23 > (let ((l (list 4 1 0 1 4)))
               (/ (reduce #'+ l)
                  (length l)))
2

取平方根求标准差

代码语言:javascript
复制
CL-USER 24 > (sqrt 2)
1.4142135

然后,只需将其组装成几个函数:averagevariancestandard-deviation

票数 5
EN

Stack Overflow用户

发布于 2016-09-11 17:42:44

你拿的是- a ...,而a是你的单子。

不是一个完整的答案,因为这是家庭作业,但是:您想首先计算平均值,您可以实现一个sum函数,它需要两次,有一个折叠,您可以使用一个映射对列表中的每个元素应用一个助手函数或lambda表达式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39438755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档