Вы определяете h
как функцию без аргументов, а затем пытаетесь использовать ее, как если бы это было число. Я также не уверен, к чему ты клонишь с (sum simpson-term 0 inc n)
; Я просто предположу, что sum
- это какая-то магия, которую вы получили от SICP, и что аргументы, которые вы ей передаете, верны (я смутно припоминаю, что они определяют какую-то общую сумму).
Другое дело, что почти всегда ужасно иметь def
или defn
, вложенных в defn
. Вы, вероятно, хотите либо let
(для чего-то временного или локального) или другого верхнего уровня defn
.
Помня, что я годами не писал simpson
функцию и не проверял ее на алгоритмическую корректность на всех , вот эскиз, который ближе к "правильной форме" "чем ваш:
(defn simpson [f a b n]
(let [h (/ (- b a) n)
simpson-term (fn [k]
(let [y (f (+ a (* k h)))]
(cond
(= k 0) y
(= k n) y
(even? k) (* 2 y)
:else (* 4 y))))]
(* (/ h 3)
(sum simpson-term 0 inc n))))