我对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)但是在运行时,它会产生错误:
(1 2 3 4 5) is not a number我相信我已经正确地模拟了标准偏差公式(虽然我不会把它抛到过去去犯一个愚蠢的错误),但是为什么我的程序不喜欢我给它评估的数字列表呢?这很可能是一个简单的错误,输入从这种新的编码风格,但任何和所有的帮助是非常感谢的!
发布于 2016-09-11 18:34:13
使用压痕。我编辑了你的问题:
(defun stdev (x)
(sqrt (/ (apply '+ (expt (- x (/ (apply '+ x)
(length x)))
2))
(length x))))expt返回一个数字。你叫(apply '+ some-number)
也可以从列表中减去一个数字。
为什么?
通常建议使用Lisp侦听器(也称为REPL)来实现工作代码:
计算平均值:
CL-USER 21 > (let ((l (list 1 2 3 4 5)))
(/ (reduce #'+ l)
(length l)))
3用映射器减去平均值和平方
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然后,只需将其组装成几个函数:average、variance和standard-deviation。
发布于 2016-09-11 17:42:44
你拿的是- a ...,而a是你的单子。
不是一个完整的答案,因为这是家庭作业,但是:您想首先计算平均值,您可以实现一个sum函数,它需要两次,有一个折叠,您可以使用一个映射对列表中的每个元素应用一个助手函数或lambda表达式。
https://stackoverflow.com/questions/39438755
复制相似问题