Решение выражения с Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте,помогите пожалуйста с реализацией вот этого на языке Lisp:
Вернее так

Решение задачи: «Решение выражения с Lisp»

textual
Листинг программы
;; Итерация:
 
(defun f (a n)
  (iter (for i from 1 to n) (summing (/ (* i a) (+ a i)))))
 
==> f
 
(f 3 10)
 
==> 715867/40040
 
(f 3.0 10)
 
==> 17.8787962037962
 
;; Рекурсия
 
(defun f (a n &optional (i 0) (s 0))
  (if (= i n) s 
    (let ((i1 (+ i 1))) (f a n i1 (+ s (/ (* i1 a) (+ a i1)))))))
 
==> f
 
(f 3.0 10)
 
==> 17.8787962037962
 
(f 3 10)
 
==> 715867/40040

Объяснение кода листинга программы

В первом фрагменте кода определена функция f, которая вычисляет значение выражения. Она принимает два аргумента: a и n. Внутри функции используется цикл iter, который выполняет итерацию от 1 до n. На каждой итерации выполняется операция суммирования, в которой результат вычисления выражения / (* i a) (+ a i) добавляется к сумме. Результатом работы функции является значение выражения. Во втором фрагменте кода определена функция f, которая также вычисляет значение выражения, но уже с использованием рекурсии. Функция принимает три аргумента: a, n и два необязательных аргумента i и s. Аргумент i по умолчанию равен 0, а аргумент s по умолчанию равен 0. Если i равно n, то возвращается значение s. В противном случае, внутри функции создается новая переменная i1, которая равна + i 1. Затем вызывается функция f с аргументами a, n, i1 и s с добавлением результата вычисления выражения / (* i1 a) (+ a i1). Результатом работы функции является значение выражения.

Оцени полезность:

10   голосов , оценка 3.9 из 5