Решение выражения с Lisp
Формулировка задачи:
Решение задачи: «Решение выражения с Lisp»
;; Итерация: (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). Результатом работы функции является значение выражения.