在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)))

谢谢你抽出时间回答我的问题。这解决了我的问题。谢谢你花时间回答我的问题。这解决了我的问题。