在lisp中创建卡方函数。 [初学者]

时间:2016-07-20 19:20:26

标签: 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) (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而不仅仅是在那里结束函数吗?

免责声明:我确信有更好的方法可以做到这一点,也许已经有了这个功能。我只是为了学习目的而写这个函数。

2 个答案:

答案 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