首先,我为这样一个初学者问题道歉。 我的目标不仅仅是创建一个卡方函数,而是要了解如何避免我遇到的一般问题。
我的代码如下所示:
(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上调用chi-square而nil输出只读为0.我明白为什么会发生这种情况(因为第二个条件),但我不知道知道如何避免它。例如,如果我给它一个预期列表(100 50)和一个观察列表(90 60)我希望它输出(+ 1(+ 2 0))= 3.我怎么能给(卡方nil nil)值为0而不仅仅是在那里结束函数吗?
免责声明:我确信有更好的方法可以做到这一点,也许已经有了这个功能。我只是为了学习目的而写这个函数。答案 0 :(得分:3)
第三个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))))))
您可以在specification中找到cond
宏的语法。
答案 1 :(得分:0)
一般情况下,您希望避免在过程中调用$stateChangeError
之类的内容,而是在同一列表中递归。这是因为length
的运行时间与您给出的列表的长度成正比,并且您将最终得到O(N ^ 2)算法,因为您在原始列表的每个尾部调用它。如果您的列表总是很短,那也没关系。最好在例程开始时只测试一次列表长度,或者在列表中的一个是length
而另一个不是时,最后挽救。无论如何,这里有一些其他方式来编写该函数:
null