学习 LISP - 定义标准开发函数

Learning LISP - Defining a stdev function

我是 LISP 的新手(所以请原谅我的任何愚蠢错误)并且今年的第一个实验室声明:

Define a function, STDEV that will compute the standard deviation of a list of numbers (look up formula)

我写了这段代码,但我不知道为什么它拒绝工作:

(defun stdev (x)
  (sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
                                   (length x)))
                           2))
           (length x))))

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

(STDEV a)

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

(1 2 3 4 5) is not a number

我相信我已经正确地模拟了标准差公式(虽然我不会让自己过去犯一个愚蠢的错误),但为什么我的程序不喜欢我给它计算的数字列表?这种新编码方式的输入很可能是一个简单的错误,但我们非常感谢您的帮助!

你选择 - a ...,而 a 是你的列表。

不是一个完整的答案,因为这是作业,但是:你想先计算平均值,你可以实现一个求和函数,你需要两次,折叠,你可以应用一个辅助函数或者使用映射对列表的每个元素进行 lambda 表达式。

使用缩进。我已经编辑了你的问题:

(defun stdev (x)
  (sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
                                   (length x)))
                           2))
           (length x))))

exptreturns一个数字。你打电话给(apply '+ some-number)?

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

为什么?

通常我建议使用 Lisp 侦听器(又名 REPL)来获取工作代码:

计算平均值:

CL-USER 21 > (let ((l (list 1 2 3 4 5)))
               (/ (reduce #'+ l)
                  (length l)))
3

使用mapcar减去平均值和平方:

CL-USER 22 > (mapcar (lambda (item)
                       (expt (- item 3) 2))
                     (list 1 2 3 4 5))
(4 1 0 1 4)

计算方差作为上面的平均值:

CL-USER 23 > (let ((l (list 4 1 0 1 4)))
               (/ (reduce #'+ l)
                  (length l)))
2

取平方根得到标准差:

CL-USER 24 > (sqrt 2)
1.4142135

那么你只需要assemble把它变成几个函数:averagevariancestandard-deviation