在lisp中创建卡方函数。[初学者]
首先,我为这样一个初学者的问题道歉。 我的目标不仅仅是创建卡方函数,而是了解如何避免我遇到的一般问题 我的代码如下所示:在lisp中创建卡方函数。[初学者],lisp,chi-squared,Lisp,Chi Squared,首先,我为这样一个初学者的问题道歉。 我的目标不仅仅是创建卡方函数,而是了解如何避免我遇到的一般问题 我的代码如下所示: (defun chi-square (expected-list observed-list) (cond ((not (= (length expected-list) (length observed-list))) (print "Lists do not match in length.~%")) ((and (null expected-list) (nul
(defun chi-square (expected-list observed-list)
(cond ((not (= (length expected-list) (length observed-list))) (print "Lists do not match in length.~%"))
((and (null expected-list) (null observed-list)) 0)
(+ (/ (square (- (car observed-list) (car expected-list))) (car expected-list))
(chi-square (cdr expected-list) (cdr observed-list)))
)
)
我认为第三个条件工作得很好,除了调用nil上的卡方函数和nil时,输出值仅为0。我理解为什么会发生这种情况是因为第二种情况,但我不知道如何避免它。例如,如果我给它一个100 50的预期列表和一个90 60的观察列表,我希望它输出+1+20=3。我怎样才能给卡方nil nil一个0的值,而不只是在此时此地结束函数
免责声明:我相信有更好的方法可以做到这一点,也许函数已经做到了。我编写此函数只是为了学习。第三种情况下有一个错误:求和前缺少t:
(defun chi-square (expected-list observed-list)
(cond ((not (= (length expected-list) (length observed-list)))
(print "Lists do not match in length.~%"))
((and (null expected-list) (null observed-list)) 0)
(t (+ (/ (square (- (car observed-list) (car expected-list))) (car expected-list))
(chi-square (cdr expected-list) (cdr observed-list))))))
您可以在中找到cond宏的语法。第三个cond案例中有一个错误:t在总和之前缺失:
(defun chi-square (expected-list observed-list)
(cond ((not (= (length expected-list) (length observed-list)))
(print "Lists do not match in length.~%"))
((and (null expected-list) (null observed-list)) 0)
(t (+ (/ (square (- (car observed-list) (car expected-list))) (car expected-list))
(chi-square (cdr expected-list) (cdr observed-list))))))
您可以在中找到cond宏的语法。通常,您希望避免在过程中调用类似于length的东西,因为在该过程中,您将递归到同一列表。这是因为长度的运行时与您给出的列表的长度成正比,并且最终会得到一个ON^2算法,因为您在原始列表的每个尾部调用它。如果你的单子总是很短,那也没关系。最好在例程开始时只测试一次列表长度,或者在列表中的一个为空而另一个为空时退出。无论如何,这里有一些编写该函数的其他方法:
;using built-in recursion combinators (mapcar & reduce)
(defun χ² (expected observed)
(reduce #'+ (mapcar (lambda (e o) (/ (square (- o e)) e)) expected observed)))
;using loop
(defun chi-sqr (expected observed)
(loop
for e in expected
for o in observed
summing (/ (square (- o e)) e)))
一般来说,您希望避免在过程内部调用类似length的东西,因为在该过程中,您将递归到同一个列表。这是因为长度的运行时与您给出的列表的长度成正比,并且最终会得到一个ON^2算法,因为您在原始列表的每个尾部调用它。如果你的单子总是很短,那也没关系。最好在例程开始时只测试一次列表长度,或者在列表中的一个为空而另一个为空时退出。无论如何,这里有一些编写该函数的其他方法:
;using built-in recursion combinators (mapcar & reduce)
(defun χ² (expected observed)
(reduce #'+ (mapcar (lambda (e o) (/ (square (- o e)) e)) expected observed)))
;using loop
(defun chi-sqr (expected observed)
(loop
for e in expected
for o in observed
summing (/ (square (- o e)) e)))
谢谢你抽出时间回答我的问题。这解决了我的问题。谢谢你花时间回答我的问题。这解决了我的问题。