我是LISP的新手(请原谅我任何愚蠢的错误),并且今年的第一个实验室指出:
定义一个函数,STDEV将计算数字列表的标准偏差(查找公式)
我写了这段代码,但我不知道为什么它拒绝工作:
(defun stdev (x)
(sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
(length x)))
2))
(length x))))
(setq a '(1 2 3 4 5))
(STDEV a)
Run Code Online (Sandbox Code Playgroud)
但在运行时它会产生错误:"(1 2 3 4 5)不是数字"
我相信我已经正确地模仿了标准偏差公式(虽然我不会过去自己做出一个愚蠢的错误),但为什么我的程序不喜欢我给它评估的数字列表?这种新编码方式的输入很可能是一个简单的错误,但是非常感谢任何和所有的帮助!
使用缩进.我编辑了你的问题:
(defun stdev (x)
(sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
(length x)))
2))
(length x))))
Run Code Online (Sandbox Code Playgroud)
expt返回一个数字.你打电话(apply '+ some-number)?
您还从列表中减去一个数字.
为什么?
一般来说,我建议使用Lisp监听器(也称为REPL)来获取工作代码:
计算平均值:
CL-USER 21 > (let ((l (list 1 2 3 4 5)))
(/ (reduce #'+ l)
(length l)))
3
Run Code Online (Sandbox Code Playgroud)
使用mapcar减去平均值和平方:
CL-USER 22 > (mapcar (lambda (item)
(expt (- item 3) 2))
(list 1 2 3 4 5))
(4 1 0 1 4)
Run Code Online (Sandbox Code Playgroud)
将方差计算为上述平均值:
CL-USER 23 > (let ((l (list 4 1 0 1 4)))
(/ (reduce #'+ l)
(length l)))
2
Run Code Online (Sandbox Code Playgroud)
取平方根得到标准偏差:
CL-USER 24 > (sqrt 2)
1.4142135
Run Code Online (Sandbox Code Playgroud)
然后,你只需要将它组装成几个功能:average,variance和standard-deviation.
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |