Прежде всего, я прошу прощения за такой вопрос новичка. Моя цель — не просто создать функцию хи-квадрат, но и понять, как избежать общей проблемы, с которой я сталкиваюсь.
Мой код выглядит так:
(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 (+ 2 0)) = 3. Как я могу дать (хи-квадрат nil nil) значение 0, не завершая функцию прямо здесь и сейчас?
отказ от ответственности: я уверен, что есть лучшие способы сделать это и, возможно, функции, которые уже делают это. Я пишу эту функцию только в учебных целях.