Посчитать с заданной точностью сумму бесконечного ряда - Lisp
Формулировка задачи:
Задача:посчитать с заданной точностью сумму бесконечного ряда,каждый член которого задается формулой: x^k/k!( что есть exp(x))
Не могу понять почему не работает код(выдает ошибку file-of-end),вообще его нужно реализовать с помощью цикла loop,но я пытался и рекурсивным способом,тщетно.
(defun faK(x)
(cond((eq x 0) 1)
((eq x 1) 1)
((< x 0) nil)
(t ( * x (faK (- x 1))))))
(defun sumr(x e)
((setq i 0)
(setq s 0)
(loop
(setq s (+ s (/ (expt x i) faK(i))))
(if ( > (abs s) 3)(return s) nil)
(setq i (+ i 1))))))
(defun sumr(x e i);;рекурсивный способ
(t (cond (< (abs (/ (expt x i) faK(i))) e) (+ 0 sumr x e (+ i 1)))))Решение задачи: «Посчитать с заданной точностью сумму бесконечного ряда»
textual
Листинг программы
(defun sumr(x e) (let ((i 0) (s 0)) (loop (setf s (+ s (/ (expt x i) (fak i)))) (when ( > (abs s) e) (return s)) (incf i))))
Объяснение кода листинга программы
В данном коде:
- Создаётся функция
sumrс двумя аргументамиxиe. - В функции используется замыкание
let, чтобы создать две переменныеiиsсо значениями 0. - Используется цикл
loop, который выполняется до тех пор, пока абсолютное значение суммыsне превысит значениеe. - Внутри цикла значение переменной
sувеличивается на суммуsи результата вычисления(expt x i) / (fak i). - Значение переменной
iувеличивается на 1 после каждой итерации цикла. - Когда условие цикла не выполняется, функция возвращает значение переменной
s.